有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,这实际上破坏了很多现有代码

我目前正在探索的是:

  1. 有没有一种方法可以进行会话。get()在不声明Id类的情况下工作(我知道这是一种不鼓励的做法,但所需的更改量可能会很高)
  2. 另一种方法是让hibernate像以前一样处理属性,而不在属性前面添加id吗
  3. 将hibernate升级到v4(不容易,因为依赖项目和审批流程)
  4. 还有其他选择/解决方案吗

到目前为止,我只找到了上述解决方案,但我正在寻找干扰性较小的解决方案,如果有任何线索、建议和相关文档的指针,我将不胜感激


共 (0) 个答案