【问题标题】:Do I need @Transient annotation on un-mapped super-class attributes?我需要在未映射的超类属性上使用@Transient 注释吗?
【发布时间】:2014-07-17 04:55:11
【问题描述】:

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

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

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.

}

AbstractSuperEntity 中的someFlag 属性是否需要有@Transient

我试过了,不管有没有,它似乎没有任何区别。但我只是害怕我错过了什么。


编辑感谢所有快速回答。

一位同事还向我介绍了 JPalace.org 上的 JPA 教程,特别是 ORM and JPA Concepts 上的页面,其中包含以下部分:

非实体超类

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

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

【问题讨论】:

    标签: java hibernate jpa transient


    【解决方案1】:

    如果该属性不是全局持久性的,那么添加 @Transient 注释不会有任何害处,实际上会使其对您的代码的未来读者显式瞬态。

    【讨论】:

      【解决方案2】:

      我将不同意 Jukka 并说您不需要注释。从您的配置中应该很明显,超类不是由 Hibernate 映射的,而且就 Hibernate 而言,您的超类甚至不存在。

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

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

      【讨论】:

      • 谢谢詹姆斯,我和你一样觉得没有任何可能让未来的开发者感到困惑的东西。在我们的例子中,抽象超类是由以前的员工创建的,他将@Transient 注释放在它的属性上。正如你所说,我对为什么会有这些注释感到困惑。他们现在走了! :-)
      【解决方案3】:

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

      【讨论】:

      • 谢谢安德烈。尽管詹姆斯首先回答了这个问题,但我还是要给你答案,因为你的答案简洁、明确并且有一些有用的链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多