java如何处理会话。你有什么奇怪的行为吗?
我试图在对象的会话上执行get,该对象声明的复合id没有映射的复合标识符
使用的Hibernate版本是3.5.5
获取代码是通用的,读取包装实际数据的容器对象:
ClassMetadata metadata =
session.getSessionFactory().getClassMetadata(wrapper.getDomainClass());
Serializable id = metadata.getIdentifier(wrapper, EntityMode.POJO);
return session.get(wrapper.getDomainClass(), id, LockOptions.UPGRADE);
代码不知道任何关于实际映射的信息,所以它必须查阅有关id的元数据
如果映射定义如下:
<hibernate-mapping default-access="field">
<class name="Wrapper"
entity-name="Data"
table="DATA">
<composite-id>
<key-property name="identifier" column="identifier" />
<key-property name="version" column="version" />
</composite-id>
<component name="domainObject" class="Data">
<property name="source" column="source" />
</component>
</class>
</hibernate-mapping>
如果没有复合标识符类,id就等于对象本身,也等于包装器引用
当我做课时。get()不是从数据库中提取对象,而是返回id中传递的相同对象(不是相等的对象,而是相同的对象实例)
Upd:事实上是一节课。get()从数据库in
加载对象。id对象被传递并返回。我最初认为它跳过了加载
到目前为止,我找到的解决方案是引入映射复合标识符,并将映射更改为:
<hibernate-mapping default-access="field">
<class name="Wrapper"
entity-name="Data1"
table="DATA_1">
<composite-id class="SurrogateKey" mapped="true">
<key-property name="identifier" column="identifier" />
<key-property name="version" column="version" />
</composite-id>
<component name="domainObject" class="Data">
<property name="source" column="source" />
</component>
</class>
</hibernate-mapping>
代理基被定义为具有两个字段和equals/hashcode的对象
使用元数据返回的此更改id。getIdentifier()是代理密钥和会话的实例。get()从数据库中获取对象(如果存在)
mapping fix的问题是,criteria和HQL的属性名称从identifier更改为id.identifier,这实际上破坏了很多现有代码
我目前正在探索的是:
- 有没有一种方法可以进行会话。get()在不声明Id类的情况下工作(我知道这是一种不鼓励的做法,但所需的更改量可能会很高)李>
- 另一种方法是让hibernate像以前一样处理属性,而不在属性前面添加id吗李>
- 将hibernate升级到v4(不容易,因为依赖项目和审批流程)李>
- 还有其他选择/解决方案吗李>
到目前为止,我只找到了上述解决方案,但我正在寻找干扰性较小的解决方案,如果有任何线索、建议和相关文档的指针,我将不胜感激
共 (0) 个答案