我有一个具有一个或多个<many-to-one
映射的Hibernate实体,例如
<hibernate-mapping>
<class name="MyClass" table="my_table">
<cache usage="nonstrict-read-write"/>
<composite-id>
<key-property name="id" length="30"/>
<key-property name="someRef" length="30" column="foreign_key_to_something"/>
</composite-id>
<many-to-one name="mappedProperty" column="foreign_key_to_something" insert="false" update="false"/>
<property name="foo" column="foo"/>
...
</class>
</hibernate-mapping>
我需要创建一个这样的实体,并在创建后立即访问
mappedProperty
。我可以在这里看到两种方法:1)创建实体并手动设置所有相关的
<many-to-one
映射。这种方法的明显缺点是需要繁琐的工作,特别是如果映射的<many-to-one
实体的数量很高时。如果框架可以为您做些什么,为什么还要手动做呢?2)仅通过初始化必要的参数(例如主键,上述情况下的
id
和someRef
)来创建实体,然后立即保存并重新加载。加载应自动初始化mappedProperty
或按需提供延迟初始化。我更喜欢选项2),但是,我注意到在某些情况下未设置
mappedProperty
属性。 load()
返回与传递给create()
的相同对象,只初始化了主键。我仍然不确定为什么会发生这种情况,但是要解决这个问题,我必须将对象与Hibernate会话分离,以便load()
被迫进入数据库并重新获得。再说一次,听起来很复杂,不是吗?我在这里想念什么吗?还有其他方法可以解决此问题吗?
最佳答案
当您需要从数据库刷新对象的状态时,请使用refresh()
。