【问题标题】:Hibernate/JPA - annotating bean methods vs fields [duplicate]Hibernate/JPA - 注释 bean 方法和字段
【发布时间】:2010-10-30 19:59:46
【问题描述】:

我有一个关于 Hibernate 使用的简单问题。我不断看到人们以两种方式之一使用 JPA 注释,即注释类的字段以及注释相应 bean 上的 get 方法。

我的问题如下:用@Id等JPA注解注解字段和bean方法有区别吗?

示例:

@Entity
public class User
{

**@ID**
private int id;

public int getId(){
return this.id;
}

public void setId(int id){
this.id=id;
}

}

-----------或------------

@Entity
public class User
{


private int id;

**@ID**
public int getId(){
return this.id;
}

public void setId(int id){
this.id=id;
}

}

【问题讨论】:

    标签: java hibernate orm jpa


    【解决方案1】:

    是的,如果您对字段进行注释,Hibernate 将使用字段访问来设置和获取这些字段。如果您对方法进行注释,hibernate 将使用 getter 和 setter。 Hibernate 将根据@Id 注释的位置选择访问方法,据我所知,您不能混搭。如果您使用@Id 注释字段,则方法上的注释将被忽略,反之亦然。也可以手动设置类级别注解@AccessType的方法

    Hibernate Annotations reference guide 已被证明是解决此类问题的非常有用的资源,并详细说明了访问类型如何向下级联。

    【讨论】:

    • @David - 是的,我相信 JPA 也是如此。但是 JPA 不支持 @AccessType
    • 一个更正,你实际上可以混合方法。我的意思是你可以拥有一个具有 AccessType.PROPERTY 和 AccessType.FIElD 的类。虽然不推荐,但你可以做到。
    【解决方案2】:

    是的,我相信您想搜索字段与属性访问:

    Hibernate Annotations - Which is better, field or property access?

    Spring 首选项是field access。这就是我所遵循的。

    【讨论】:

      【解决方案3】:

      我的建议是注释方法。通过这样做,您可以获得一点灵活性。例如,假设您有几个类:

      • AbstractEntity
      • StringIdEntity
      • AutoIdEntity

      AbstractEntity 定义了 id 字段/getter/setter。 StringIdEntityAutoIdEntity 类继承自 AbstractEntity,但使用不同的 @Id 策略。如果您注释该字段,则不能将其从类更改为另一个。

      如果您对方法进行注释,则在AbstractEntity 中将getId() 标记为@Transient/abstract,然后在子类中,您只需覆盖该方法并应用您希望使用的策略。我曾经自己注释字段并遇到了这个问题,并决定我将始终注释前进的方法。

      因此,即使您没有立即看到注释方法的好处,但当您拥有如此多的类时,切换将变得绝对令人头疼。

      【讨论】:

        【解决方案4】:

        为什么要注释访问器?它看起来很凌乱,维护起来很痛苦。现在我必须在全班范围内寻找 JPA 或 Hibernate 是如何应用的。当使用一些用于 Eclipse 的 Hibernate 代码生成插件时,这是默认设置,它让我发疯。

        更不用说我们使用访问器的另一个原因是向属性访问或引用父对象或其他无法与所述注释很好地融合的对象添加逻辑。

        【讨论】:

        【解决方案5】:

        有几个讨论提供了使用 FIELD 而非属性的优势(请参阅 - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype)。甚至 spring 框架也建议使用 FIELD over property(参见 - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html)。 我发现 FIELD 更简洁的方法不仅因为您不必强制实现 setter/getter,而且您可以在课堂上使用自定义类型的 setter/getter。 所以更好的封装和更干净的类。性能方面 FIELD 比 PROPERTY 有一点优势,但可以忽略不计。

        在一行中使用 FIELD 而不是 PROPERTY。如果你真的需要它,请使用 PROPERTY。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 2010-09-24
          • 2016-07-16
          • 1970-01-01
          • 2021-03-22
          • 1970-01-01
          • 2011-11-30
          相关资源
          最近更新 更多