Man*_*ius 44 java annotations hibernate jpa
您将如何在以下示例代码中配置注释?我只想坚持使用JPA注释,并避免使用Hibernate特定的依赖项.以下代码是否正确?
@Entity
public class RefExample extends RefData {
}
Run Code Online (Sandbox Code Playgroud)
(这些类将有多个版本,RefSomeOtherExample等,每个类有一个db表.有些可能会添加其他字段(列),但大多数只会使用从"RefData"基类继承的基本字段.)
基类:
@Entity
public abstract class RefData {
private long id;
private String code;
private String desc;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(unique = true, nullable = false, length=8)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Column(unique = true, nullable = false, length=80)
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我想使用Hibernate的SchemaExport类从中生成模式创建脚本.在上面的情况下,这两个类应该只导致创建一个名为"RefExample"的表,其中包含"RefData"中的三列.这会有用吗?
Art*_*ald 91
从JPA 1.0规范:
抽象类和具体类都可以是实体.抽象和具体类都可以使用实体注释进行注释,映射为实体,并作为实体进行查询.
实体可以扩展非实体类,非实体类可以扩展实体类.
如您所希望的那样,您应该使用单表继承.
只需定义一个鉴别器列,如下所示:
@Entity
@DiscriminatorColumn(name="REF_TYPE")
public abstract class RefData {
Run Code Online (Sandbox Code Playgroud)
但是,如果您不想依赖JPA继承策略,则可以使用MappedSuperclass:
@MappedSuperclass
public abstract class RefData {
Run Code Online (Sandbox Code Playgroud)
JPA规范
实体可以从提供持久实体状态和映射信息的超类继承,但它本身不是实体.通常,这种映射的超类的目的是定义多个实体类共有的状态和映射信息.
请记住,您不能同时使用@Entity和@MappedSuperclass.
小智 5
@MappedSuperclass对我有用.我正在努力将视图映射到2个父类和子类的对象.我的观点来自2个表格.两个表中的主键都存在于视图中.@DiscriminatorColumn对我不起作用,因为它需要一个专门分配给对象数据类型的列,而且它也是'repeated Column in object exception'我无法解决的抛出.
我读了这个论坛,我尝试了@MappedSuperclass注释.它成功了.
我把@MappedSuperclass放在超类中,并将@Id和@GeneratedValue放在超类标识符中.在我给出的子类中
@Entity
@Table(name="view_name")
Run Code Online (Sandbox Code Playgroud)
并使用子类对象从视图中获取数据.而已.
使用@DiscriminatorColumn对已加入表的hibernate注释进行继承为我工作.
| 归档时间: |
|
| 查看次数: |
64986 次 |
| 最近记录: |