Hibernate / JPA – 注释bean方法vs字段

我有一个关于Hibernate使用的简单问题。 我一直使用JPA注释中的一种方法来注释一个类的字段,并在相应的bean上注释get方法。

我的问题如下:注解字段和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; } } 

– – – – – -要么 – – – – – –

 @Entity public class User { private int id; **@ID** public int getId(){ return this.id; } public void setId(int id){ this.id=id; } } 

是的,我相信你想在现场和财产访问search:

Hibernate的注释 – 哪个更好,是字段还是属性?

Spring的首选是字段访问 。 这就是我所遵循的。

是的,如果你注释这些字段,Hibernate将使用字段访问来设置和获取这些字段。 如果你注释的方法,hibernate将使用getters和setter。 Hibernate会根据@Id注释的位置来select访​​问方法,而且据我所知,你不能混合和匹配。 如果用@Id注解一个字段,方法上的注释将被忽略,反之亦然。 您也可以使用类级注释@AccessType手动设置方法

Hibernate Annotations参考指南已经被certificate是这样的问题的一个非常有用的资源,并且详细介绍了访问types如何级联层级。

为什么要注释访问者? 它看起来简单凌乱,是一个痛苦的维护。 现在,我必须在整个课程中寻找JPA或Hibernate是如何应用的。 在使用Eclipse的一些Hibernate代码生成插件的时候,这是默认的,它会使我疯狂。

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

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

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

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

如果注解了这些方法,那么在AbstractEntity中将getId()标记为@Transient/abstract ,然后在子类中,只需重写该方法并应用您希望使用的策略即可。 我曾经自己注释领域,并遇到这个问题,并决定我将始终注解前进的方法。

所以,即使你没有立即看到注释方法的好处,但是如果你有这么多的类,切换将成为一个绝对头痛的问题,那么可能会变得很明显。

是否答案为其他JPA实现hibernate相同?

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

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