如何在多对多关系中使用Hibernate在连接表中插入常量值?

时间:2015-03-06 10:30:32

标签: java hibernate

我有一个像A - AB - B的映射,但AB表也是其他表的连接表(是的,谢谢,没有评论:p)。在AB表中,我有一个CODE(非空)列。

我可以通过在映射中添加where标记来获取正确的数据,但是当我插入值时,Hibernate不会在CODE列中添加值...好吧,我不知道如何告诉Hibernate做什么这一点。

以下是A表的映射以获取Set:

      <set name="b" table="AB" lazy="false" where="CODE='1.2.3'">
        <key column="A_ID" />
          <many-to-many column="B_ID" class="B">
          </many-to-many>
      </set>

Hibernate创建一个只包含A_ID和B_ID值的插入,我想告诉Hibernate在其SQL INSERT查询中插入CODE ='1.2.3'。

非常感谢你的帮助,

更新

从Java的角度来看,这个想法是在A:getB():Set<B>中有这样的签名我想要getAB():Set<AB>

由于

2 个答案:

答案 0 :(得分:0)

AB使用两个类{} ID ABIdClass(A_ID,B_ID),另一个类Code(和所有额外列)ABClass(CODE)并使用{{1}常量值列的属性:

default

你也可以尝试这样的事情:

<class name="ABClass" table="AB">
    <composite-id name="id" class="ABIdClass">
        <key-many-to-one name="a" class="A" column="a_id" />
        <key-many-to-one name="b" class="B" column="b_id" />
    </composite-id>
    <property name="code" type="string">
        <column name="code" not-null="false" default="1.2.3" />
    <property/>
</class>

希望这些有用。

答案 1 :(得分:0)

您应该能够使用Hibernate Table per Class Hierarchy方法实现您的目标。

abstract class Mapping { private String code; }
class TableA {}
class TableB {}
class TableAB extends Mapping { private TableA a; private TableB b; }
class TableC {}
class TableD {}
class TableCD extends Mapping { private TableC c; private TableD d; }
class TableE {}
class TableF {}
class TableEF extends Mapping { private TableE e; private TableF f; }

<class name="TableA" table="tableA"/>
<class name="TableB" table="tableB"/>
<class name="TableC" table="tableC"/>
<class name="TableD" table="tableD"/>
<class name="TableE" table="tableE"/>
<class name="TableF" table="tableF"/>
<class name="Mapping" table="mapping">
  <discriminator column="CODE" type="string"/>
  <subclass name="TableAB" discriminator-value="1.2.3">
    <property name="a" column="a_id"/>
    <property name="b" column="b_id"/>
  </subclass>
  <subclass name="TableCD" discriminator-value="4.5.6">
    <property name="c" column="a_id"/>
    <property name="d" column="b_id"/>
  </subclass>
  <subclass name="TableEF" discriminator-value="7.8.9">
    <property name="e" column="a_id"/>
    <property name="f" column="b_id"/>
  </subclass>
</class>

请注意,列a_idb_id对于所有关系都是通用的。这将确保单个映射表可以根据需要用于不同的关系。