仅将HQL查询限制为父类

时间:2017-09-20 07:26:03

标签: java hibernate

我有两个类A和B. B扩展A.我想通过HQL类A更新.B被映射为每个具体类的表。我无法控制映射。所以我不能引入新的抽象类。

“更新A set attr1 = 1”将根据我的知识更新A类和B类。是否可以通过HQL仅更新A类?我可以使用特制的HQL来阻止创建临时批量更新表吗?

public class A {
  ...
}


public class B extends A {
   ...
}

session.createQuery("Update A set attr1=1").executeUpdate();


<hibernate-mapping auto-import="false" default-
  cascade="none" default-access="property" default-lazy="true">
    <class name="A" table="a" abstract="false" 
        polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false">
         <id name="id" column="id"/>       
         <property name="attr1" column="attr1" unique="false" optimistic-lock="true" lazy="false" generated="never"/>           

     </class>
</hibernate-mapping>

<hibernate-mapping auto-import="false" default-cascade="none" default-access="property" default-lazy="true">
    <union-subclass name="B" table="b" batch-size="20" extends="A" dynamic-update="false" dynamic-insert="false" select-before-update="false">


        <property name="attr2" column="attr2" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
    </union-subclass>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:0)

最后我确实提出了以下解决方案。我无法更改A类或B类。我无法控制A.hbm或B.hbm,但我可以在运行时进行补丁hibernate配置。

我创建了一个新类APatched:

  class APatched extends A {
  }

添加了一个APatched.hbm映射文件:

 <hibernate-mapping auto-import="false" default-cascade="none" default-access="property" default-lazy="true">
<union-subclass name="APatched" table="not_existing" batch-size="20" extends="A" dynamic-update="false" dynamic-insert="false" select-before-update="false">



</union-subclass>

和Monkey在Hibernate启动之前修补了Hibernate配置:

  configuration.addResource('APatched.hbm');
  configuration.buildMappings();
  PersistentClass toBePatched = configuration.getClassMapping(A.class.getName());
  String oldTableName = toBePatched.getTable().getName();
  toBePatched.getTable().setName(oldTableName + "_patched_not_existing");
  toBePatched.getTable().setAbstract(true);
  toBePatched.setAbstract(true);

  PersistentClass patched = configuration.getClassMapping(APatched.class.getName());
  patched.getTable().setName(oldTableName);

我将我的HQL更改为:

 session.createQuery("Update APatched set attr1=1").executeUpdate();

这样我就可以在原始建模类中注入缺少的概念,并防止在hibernate多表批量操作期间使用临时表。