我正在为两个不同的表创建相同的实体。为了使两个实体的表Map等不同,但只在一个地方有代码的其余部分-一个抽象超类。最好的事情是能够注解通用的东西,如列名(因为将是相同的),但这不起作用,因为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
}
我想继承它,只指定特定于孩子的内容,如注解:
@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;
}
有什么想法吗?我是否必须在子类中创建字段、getter和setter?
谢谢,克里斯
5条答案
按热度按时间56lgkhnf1#
你可能想用
@MappedSuperclass
类来标注MyAbstractEntity,这样Hibernate就可以导入MyAbstractEntity的配置到子类中,而你不必覆盖这个字段,只需要使用父类的字段。这个标注是一个信号,告诉Hibernate它也必须检查父类。否则它会认为它可以忽略它。ruarlubt2#
下面是一个示例,其中的一些解释可能会有所帮助。
@MappedSuperclass
:@Inheritance
指定以下三种Map策略之一:1.单表
1.已加入
1.每个类的表
@DiscriminatorColumn
用于定义将使用哪个列来区分子对象。@DiscriminatorValue
用于指定用来区分子对象的值。下列程式码会产生下列结果:
您可以看到id字段在两个表中都有,但只在
AbstractEntityId @MappedSuperclass
中指定。此外,
@DisciminatorColumn
在“交易方”表中显示为PARTY_TYPE。@DiscriminatorValue
在当事人表的PARTY_TYPE列中显示为Person记录。非常重要的是,
AbstractEntityId
类根本不会持久化。我没有指定
@Column
注解,而是只依赖于默认值。如果您添加了一个扩展了“交易方”的组织实体,并且该实体接下来被保留,则“交易方”表将具有:
组织表的第一个条目将具有:
希望这对你有帮助:)
yx2lnoni3#
将超类标记为
并从子类中删除该属性。
aij0ehis4#
使用
@MappedSuperclass
注解基类应该可以完全满足您的需要。yqyhoc1h5#
这是旧的,但我最近处理了这个问题,并希望分享我的解决方案。
第一个