有一个getter时,Hibernate总是需要一个setter吗?
我们有一些用@Column
和@Basic
注解的Hibernate getter方法。
如果我们没有相应的setter,我们会得到一个exception。 为什么是这样?
在我们的例子中,我们得到的是从getter返回的值(存储在数据库中),setter没有function。 所以我们只是有一个空方法来解决错误条件。
正如其他人所提到的,如果你注释一个属性getter方法,那么Hibernate在从数据库读取值时使用setter。 基本上,Hibernate假定它正在写入数据库的任何内容最终都需要从数据库中读取。 这意味着如果你注解了一个getter,那么当从数据库读取对象的时候,它需要调用setter。
你可以让setter私有(Hibernate将使用reflection来访问setter)。 这是保持你的类的合同,同时仍然使用Hibernate进行关系映射的好方法。
如果该字段是从类中的其他属性派生的,那么为什么要将其存储在数据库中? 您可以使用@Transient
注释来标记不应该存储在数据库中的字段。 你甚至可以使用@Formula
注解来让Hibernate为你导出这个字段(这是通过使用查询中的公式来实现的)。
你应该使用@Entity(access = AccessType.FIELD)
注释你的类并注释你的属性。 这应该可以解决你的问题。 setter是支持重构的最好方法。 那里有一个小筹码人员有什么问题?
访问=字段,如果你不想使用setter
<id name="countryId" column="id" type="int"> <generator class="increment"> </generator> </id> <property name="name" column="name" access="field" type="string"></property> <property name="countryCode" column="country_code" access= "field" type="string"></property>
Hibernate使用set
方法来初始化你从数据库中读取的实体。
也许,如果你使访问修饰符实体字段default
或protected
或public
那么Hibernate将直接初始化字段,而不使用setter(我读了一些关于它,但我不知道它的工作原理)。 但使用setter是更受欢迎的方式。
如果你不使用setter并使用私有属性,Hibernate将不得不通过reflection来检索字段,并执行field.setAccessible(true)。 我不认为Hibernate这样做。
我不知道我们是否可以告诉Hibernate做到这一点,但据我记得,默认configuration是使用setters …将一个日志/ sysout放在一个集合,你会看到它使用setter。