我有一个具有一个或多个<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)仅通过初始化必要的参数(例如主键,上述情况下的idsomeRef)来创建实体,然后立即保存并重新加载。加载应自动初始化mappedProperty或按需提供延迟初始化。

我更喜欢选项2),但是,我注意到在某些情况下未设置mappedProperty属性。 load()返回与传递给create()的相同对象,只初始化了主键。我仍然不确定为什么会发生这种情况,但是要解决这个问题,我必须将对象与Hibernate会话分离,以便load()被迫进入数据库并重新获得。再说一次,听起来很复杂,不是吗?

我在这里想念什么吗?还有其他方法可以解决此问题吗?

最佳答案

当您需要从数据库刷新对象的状态时,请使用refresh()

08-18 08:34
查看更多