簡體   English   中英

僅將HQL查詢限制為父類

[英]Restrict HQL query to parent class only

我有兩個類A和B。B擴展了A。我想通過HQL類A更新。B被映射為每個具體類的表。 我無法控制這些映射。 因此,例如,我不能引入新的抽象類。

據我所知,“更新設置為attr1 = 1的A”將更新類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>

最后,我確實提出了以下解決方案。 我無法更改A或B類。我無法控制A.hbm或B.hbm,但是我可以在運行時對休眠配置進行猴子補丁。

我創建了一個新的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>

和猴子在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();

這樣,我就可以將缺失的概念注入原始的建模類中,並在休眠的多表批量操作期間防止使用臨時表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM