Java Hibernate/JPA-注释bean方法与字段

Java Hibernate/JPA-注释bean方法与字段,java,hibernate,orm,jpa,Java,Hibernate,Orm,Jpa,我有一个关于Hibernate使用的简单问题。我经常看到人们通过两种方式之一使用JPA注释,一种是注释类的字段,另一种是注释相应bean上的get方法 我的问题如下:注释字段和使用JPA注释(如@Id)的bean方法之间是否有区别 例如: @Entity public class User { **@ID** private int id; public int getId(){ return this.id; } public void setId(int id){ this.id=id

我有一个关于Hibernate使用的简单问题。我经常看到人们通过两种方式之一使用JPA注释,一种是注释类的字段,另一种是注释相应bean上的get方法

我的问题如下:注释字段和使用JPA注释(如@Id)的bean方法之间是否有区别

例如:

@Entity
public class User
{

**@ID**
private int id;

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

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

}
-----------或-----------


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


对于此类问题,已证明是非常有用的资源,并详细说明了访问类型是如何按层次结构进行级联的。

是的,我相信您希望搜索字段访问还是属性访问:


弹簧偏好是。这就是我所遵循的。

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

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity
AbstractEntity
定义id字段/getter/setter。类
StringIdEntity
AutoIdEntity
继承自
AbstractEntity
,但使用不同的
@Id
策略。如果对字段进行注释,则无法将其从一个类更改为另一个类

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


因此,即使您没有立即看到注释方法的好处,但当您有这么多类时,切换将成为一个绝对令人头痛的问题,这一点可能会变得很明显。

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


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

有几个讨论提供了在属性上使用字段的优势(请参阅-)。甚至spring框架也建议使用fieldover属性(参见-)。 我发现字段更干净的方法不仅因为您不必实现setter/getter,而且您可以在类中使用自定义类型setter/getter。 因此,更好的封装和更干净的类。性能方面的字段比属性有一点优势,但可以忽略不计


在一行中,在属性上使用字段。如果您确实需要,请使用属性

@David-是的,我相信JPA也是如此。然而,JPA不支持@AccessTypeOne更正,您实际上可以混合使用这种方法。我的意思是,您可以拥有一个具有AccessType.PROPERTY和AccessType.FIElD的类。虽然不建议这样做,但您可以这样做。您可以使用模板修改批注位置,以下是有关如何将批注位置从访问者更改为字段的详细教程:
@Entity
public class User
{


private int id;

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

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

}