当有吸气剂时,Hibernate是否总是需要一个setter?

Mar*_*eon 58 java hibernate getter-setter

我们有一些带有@Column和的注释的Hibernate getter方法@Basic.

如果我们没有相应的setter,我们会得到一个例外.为什么是这样?

在我们的例子中,我们导出从getter返回的值(以存储在DB中),并且setter没有功能目的.所以我们只有一个空方法来解决错误情况.

Jim*_*rne 75

正如其他人所提到的,如果你注释一个属性getter方法,那么Hibernate在从数据库中读取值时会使用setter.基本上,Hibernate假定最终需要从数据库中读取写入数据库的任何内容.这意味着如果您注释一个getter,那么它需要在从数据库中读取对象时调用setter.

您可以将setter设为私有(Hibernate将使用反射来访问setter).这是保留类的契约同时仍然使用Hibernate进行关系映射的好方法.

如果该字段是从类中的其他属性派生的,那么为什么要将它存储在数据库中?您可以使用@Transient注释标记不应存储在数据库中的字段.您甚至可以使用@Formula注释让Hibernate为您派生字段(它通过使用它发送到数据库的查询中的公式来实现).


khm*_*ise 9

您应该使用@Entity(access = AccessType.FIELD)和注释属性来注释您的类.这应该可以解决您的问题.setter是支持重构的最佳方式.那里有一个小的二传手有什么问题.

  • 只需将注释放在属性而不是getter,然后它也应该工作(阅读有关Access Type的注释文档). (4认同)
  • 请记住,将访问类型从属性更改为字段会产生副作用。Hibernate将不再使用getter和setter,而是直接通过反射访问字段,这意味着如果getter和setter中有任何特殊的逻辑,它将不再被调用。 (2认同)
  • 我觉得他们应该永远不会有特殊的逻辑实现;) (2认同)
  • @Saif在这篇文章中没有提到javax.persistence.Entity,但是org.hibernate.annotations.Entity.但是在4.1版本的Hibernate之后它已被弃用了,所以你可以使用@javax.persistence.Access(javax.persistence.AccessType.FIELD) (2认同)

vsi*_*ngh 5

设定access="field",如果你不想使用setter方法:

<class name="com.demo.hibernate.Country" table="country">
  <id name="countryId" column="id" type="int">
    <generator class="increment" />
  </id>
  <property name="name" column="name" access="field" type="string" />
  <property name="countryCode" column="country_code" access="field" type="string" />
</class>
Run Code Online (Sandbox Code Playgroud)