我有以下实体需要通过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?
你要搜索的是什么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.