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

时间:2009-06-02 21:37:11

标签: java hibernate orm jpa

我有一个关于Hibernate使用的简单问题。我通过注释类的字段以及在相应的bean上注释get方法,一直看到人们使用JPA注释中的一种方法。

我的问题如下:注释字段和bean方法与JPA annoations(例如@Id)之间是否存在差异。

示例:

@Entity
public class User
{

**@ID**
private int id;

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

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

}

----------- ----------- OR

@Entity
public class User
{


private int id;

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

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

}

5 个答案:

答案 0 :(得分:43)

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

手动设置方法

Hibernate Annotations reference guide已经证明对于这样的问题非常有用,并详细说明了访问类型如何级联层次结构。

答案 1 :(得分:15)

是的,我相信你想搜索字段与财产访问:

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

Spring的偏好是field access。这就是我所关注的。

答案 2 :(得分:4)

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

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

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

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

所以,即使你没有立即注意到注释方法的好处,当你有这么多类时,切换会变得非常令人头疼,这可能会变得很明显。

答案 3 :(得分:3)

为什么要注释访问者?它只是看起来很乱,很难维持。现在我必须在全班学习,以了解如何应用JPA或Hibernate。当使用Eclipse的一些Hibernate代码生成插件时,这是默认设置,它驱使我疯狂。

更不用说我们使用访问器的另一个原因是为属性访问或引用父或其他对象添加逻辑,这些对象与所述注释不相符。

答案 4 :(得分:2)

有几个讨论提供了使用FIELD over属性的边缘(请参阅 - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype)。甚至spring框架也建议使用FIELD over属性(参见 - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html)。 我发现FIELD更清洁的方法不仅因为你没有被迫实现setter / getters,而且你可以在你的类中拥有你的自定义类型setter / getters。 所以更好的封装和更干净的类。性能明智的FIELD比PROPERTY略胜一筹,但可以忽略不计。

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