Kri*_*fer 26 java inheritance annotations jpa
我正在为两个不同的表创建相同的实体.为了使两个实体的表映射等不同,但只将其余的代码放在一个地方 - 一个抽象的超类.最好的方法是能够在超类中注释诸如列名之类的通用内容(因为它们将是相同的),但这不起作用,因为JPA注释不是由子类继承的.这是一个例子:
public abstract class MyAbstractEntity {
@Column(name="PROPERTY") //This will not be inherited and is therefore useless here
protected String property;
public String getProperty() {
return this.property;
}
//setters, hashCode, equals etc. methods
}
Run Code Online (Sandbox Code Playgroud)
我想继承哪个,只指定特定于孩子的东西,比如注释:
@Entity
@Table(name="MY_ENTITY_TABLE")
public class MyEntity extends MyAbstractEntity {
//This will not work since this field does not override the super class field, thus the setters and getters break.
@Column(name="PROPERTY")
protected String property;
}
Run Code Online (Sandbox Code Playgroud)
任何想法或我是否必须在子类中创建字段,getter和setter?
谢谢,克里斯
sbl*_*ndy 26
您可能希望使用@MappedSuperclass类注释MyAbstractEntity,以便hibernate将在子项中导入MyAbstractEntity的配置,您不必重写该字段,只需使用父项.该注释是休眠的信号,它必须检查父类.否则它假定它可以忽略它.
Way*_*rer 13
以下是一些可能有所帮助的解释示例.
@MappedSuperclass:
@Inheritance指定三种映射策略之一:
@DiscriminatorColumn用于定义将用于区分子对象的列.
@DiscriminatorValue用于指定用于区分子对象的值.
以下代码导致以下内容:

您可以看到id字段在两个表中,但仅在AbstractEntityId @MappedSuperclass中指定.
此外,@ DiscisatorColumn在Party表中显示为PARTY_TYPE.
@DiscriminatorValue在Party表的PARTY_TYPE列中显示为Person作为记录.
非常重要的是,AbstractEntityId类根本不会持久存在.
我没有指定@Column注释,而只是依赖于默认值.
如果您添加了一个扩展Party的组织实体,并且如果该实体是下一个持久化的,那么Party表将具有:
组织表第一个条目将具有:
@MappedSuperclass
@SequenceGenerator(name = "sequenceGenerator",
initialValue = 1, allocationSize = 1)
public class AbstractEntityId implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "sequenceGenerator")
protected Long id;
public AbstractEntityId() {}
public Long getId() {
return id;
}
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "PARTY_TYPE",
discriminatorType = DiscriminatorType.STRING)
public class Party extends AbstractEntityId {
public Party() {}
}
@Entity
@DiscriminatorValue("Person")
public class Person extends Party {
private String givenName;
private String familyName;
private String preferredName;
@Temporal(TemporalType.DATE)
private Date dateOfBirth;
private String gender;
public Person() {}
// getter & setters etc.
}
希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
20011 次 |
| 最近记录: |