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

时间:2010-04-20 16:08:35

标签: java hibernate getter-setter

我们有一些使用@Column@Basic注释的Hibernate getter方法。

如果我们没有相应的setter,我们会收到异常。为什么是这样?

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

5 个答案:

答案 0 :(得分:73)

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

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

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

答案 1 :(得分:9)

您应该使用@Entity(access = AccessType.FIELD)为您的课程添加注释并注释您的属性。这应该可以解决您的问题。 setter是支持重构的最佳方式。在那里安装小安装器会有什么问题。

答案 2 :(得分:4)

如果您不想使用setter,请设置 access="field"

<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>

答案 3 :(得分:1)

Hibernate使用set方法初始化您从数据库中读取的实体。

也许,如果您创建实体字段defaultprotectedpublic的访问修饰符,那么Hibernate将直接初始化字段而不使用setter(我读了一些关于它但我不是确定它有效)。但使用setter是更受欢迎的方式。

答案 4 :(得分:-2)

如果你不使用setter并使用私有属性,Hibernate必须通过反射检索Fields并执行field.setAccessible(true)。我不认为Hibernate会这样做。

我真的不知道我们是否可以告诉Hibernate这样做,但据我记得,默认配置是使用setter ...将一个日志/ sysout放在一个集合上你会看到它使用二传手。