有一个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方法来初始化你从数据库中读取的实体。

也许,如果你使访问修饰符实体字段defaultprotectedpublic那么Hibernate将直接初始化字段,而不使用setter(我读了一些关于它,但我不知道它的工作原理)。 但使用setter是更受欢迎的方式。

如果你不使用setter并使用私有属性,Hibernate将不得不通过reflection来检索字段,并执行field.setAccessible(true)。 我不认为Hibernate这样做。

我不知道我们是否可以告诉Hibernate做到这一点,但据我记得,默认configuration是使用setters …将一个日志/ sysout放在一个集合,你会看到它使用setter。