在未映射的超类属性上是否需要@Transient注释?

时间:2014-05-28 05:44:35

标签: java hibernate jpa transient

好的,这是一个简单的例子:

我有一个抽象的超类定义:

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上的页面,其中包含以下部分:

  

非实体超类

     

实体也可以扩展非实体超类。这些超类可以是抽象的也可以是具体的。非实体超类的状态始终是非持久的。因此,实体类从非实体超类继承的任何状态都是非持久的。

     

与映射的超类类似,非实体超类可能不会被查询使用。 忽略非实体超类中存在的映射和关系注释。同样,这是因为没有相关的数据库表可以应用查询操作或关系。

3 个答案:

答案 0 :(得分:3)

不,不需要@Transient注释,因为AbstractSuperEntity既不是MappedSuperClass,也不是Entity。如果您希望它包含映射信息(继承),则必须使用其中一个注释对其进行注释。

答案 1 :(得分:2)

我将不同意Jukka并说你不需要注释。从你的配置中可以明显看出,超类没有被Hibernate映射,而就Hibernate而言,你的超类甚至都不存在。

如果你然后开始将超类上的字段标记为@Transient,我会推断整个超类是由Hibernate映射的,但是这个特殊的字段不是。如果它是超类中唯一的字段,我开始想知道为什么这个类是由Hibernate映射的,去寻找超类映射,当我找不到它等时感到困惑等等......

更广泛地说,如果我注意到任何JPA / Hibernate注释的存在,我会自动假设该类由持久性提供程序映射,但在一天结束时,它是您的项目以及您决定是什么使得代码更清晰。

答案 2 :(得分:0)

如果该属性在全局范围内不是持久性的,那么添加@Transient注释不会受到伤害,并且实际上会使它明显地成为未来代码读者的瞬态。