映射来自第三方库的值对象

Dir*_*oys 6 hibernate jpa

我有以下实体需要通过Hibernate 注释持久保存到关系数据库:

@Entity
@Table(name="fizzes")
public class Fizz {
    @Id @GeneratedValue
    @Column(name="fizz_id")
    private int id;

    @Column(name="fizz_wooz")
    private String wooz;

    // ??? here I am unsure!
    private Buzz buzz;

    // Constructor, getters/setters down here, etc...
}

public class Buzz {
    private int jupiter;

    private String neptune;

    // Constructor, getters/setters down here, etc...
}
Run Code Online (Sandbox Code Playgroud)

问题Buzz是:

  • 希望它成为自己的实体/表.我希望它是一个"值对象/类型",它被映射到fizzes表(通过向其添加列)
  • Buzz 来自第三方库,因此我无法修改它

因此,我正在寻找的最终结果是表格形式:

[fizzes] table
==============
fizz_id, PRIMARY KEY AUTO INCREMENT
fizz_wooz, NVARCHAR(50) NOT NULL
fizz_buzz_jupiter, INT NOT NULL
fizz_buzz_neptune, NVARCHAR(100) NOT NULL
Run Code Online (Sandbox Code Playgroud)

当我无法修改时,如何让Hibernate执行基于注释的映射Buzz

Tob*_*fke 8

你要搜索的是什么Embeddable.

@Entity
public class Fizz {
    ...

    @Embedded
    private Buzz buzz;

}
Run Code Online (Sandbox Code Playgroud)

你可以定义一个映射文件只是为Buzz:

<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
                        http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
    <embeddable class="...Buzz">
        <attributes>
            <basic name="jupiter"><column name="fizz_buzz_jupiter"/></basic>
            <basic name="neptune"><column name="fizz_buzz_neptune"/></basic>
        </attributes>
    </embeddable>
</entity-mappings>
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置包含该映射文件persistence.xml:

<persistence-unit>
    <mapping-file>.../orm.xml</mapping-file>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)

如果您确实想要使用注释Buzz:您无法为其他类定义注释.这就是注释的含义:它们是内联的,属于他们的类.否则与映射文件相比没有任何好处......

但您可以扩展Buzz并使用具有属性访问权限的那个:

@Entity
public class Fizz {
    ...

    @Embedded
    private BuzzExtension buzz;

}

@Embeddable
@Access(AccessType.PROPERTY)
public class BuzzExtension extends Buzz {
    @Column(name="fizz_buzz_jupiter")
    public int getJupiter() {
        return super.getJupiter();
    }

    @Column(name="fizz_buzz_neptune")
    public String getNeptune() {
        return super.getNeptune();
    }

}
Run Code Online (Sandbox Code Playgroud)

唯一的缺点:你不能使用Buzzin的实例Fizz.