好的,这是一个简单的例子:
我有一个抽象的超类定义:
abstract public class AbstractSuperEntity {
private char someFlag;
public void setSomeFlag(char flagValue) {
this.someFlag = flagValue;
}
public char getSomeFlag() {
return this.someFlag;
}
}
我的所有@Entity
类都继承自。一个例子可能是:
@Entity
@Table("SOME_ENTITY")
public class SomeEntity extends AbstractSuperEntity {
@Column(name="ID");
private Long id;
etc.
}
someFlag
中的AbstractSuperEntity
属性是否需要@Transient
?
我有没有尝试过,它似乎没有任何区别。但我只是害怕我错过了一些东西。
编辑感谢所有快速解答。
一位同事也向我指出了JPalace.org上的JPA教程,特别是ORM and JPA Concepts上的页面,其中包含以下部分:
非实体超类
实体也可以扩展非实体超类。这些超类可以是抽象的也可以是具体的。非实体超类的状态始终是非持久的。因此,实体类从非实体超类继承的任何状态都是非持久的。
与映射的超类类似,非实体超类可能不会被查询使用。 忽略非实体超类中存在的映射和关系注释。同样,这是因为没有相关的数据库表可以应用查询操作或关系。
答案 0 :(得分:3)
不,不需要@Transient
注释,因为AbstractSuperEntity
既不是MappedSuperClass
,也不是Entity
。如果您希望它包含映射信息(继承),则必须使用其中一个注释对其进行注释。
答案 1 :(得分:2)
我将不同意Jukka并说你不需要注释。从你的配置中可以明显看出,超类没有被Hibernate映射,而就Hibernate而言,你的超类甚至都不存在。
如果你然后开始将超类上的字段标记为@Transient
,我会推断整个超类是由Hibernate映射的,但是这个特殊的字段不是。如果它是超类中唯一的字段,我开始想知道为什么这个类是由Hibernate映射的,去寻找超类映射,当我找不到它等时感到困惑等等......
更广泛地说,如果我注意到任何JPA / Hibernate注释的存在,我会自动假设该类由持久性提供程序映射,但在一天结束时,它是您的项目以及您决定是什么使得代码更清晰。
答案 2 :(得分:0)
如果该属性在全局范围内不是持久性的,那么添加@Transient注释不会受到伤害,并且实际上会使它明显地成为未来代码读者的瞬态。