Hibernate:在没有连接表的情况下映射多对多

时间:2012-05-15 23:25:45

标签: hibernate

考虑我的数据库中的以下2个表:

FUNCTION_TABLE

FUNC_CD     |   INPUT_ATTR_ID   |   OUTPUT_ATTR_ID
multiply    |   1               |   3
multiply    |   2               |   3
multiply    |   4               |   6 
multiply    |   5               |   6

ATTRIBUTE_TABLE

ATTR_ID     |   ATTR_NAME
1           |   AttributeOne
2           |   AttributeTwo
etc

My Function类应包含以下内容:

public class Function {
    private String functionCode;
    private Set<Attribute> inputAttributes;
    private Attribute outputAttribute;
}

我的函数DAO将包含一个返回指定outputAttribute

的Function对象的方法

我该如何映射?我看到的任何示例都需要集合的连接表。

到目前为止,我的地图包含以下内容:

<class name="my.Function" table="FUNCTION_TABLE">
    <id name="functionCode" column="FUNC_CD" type="java.lang.String" />
    <many-to-one name="outputAttribute" class="my.Attribute" column="OUTPUT_ATTR_ID"/>
</class>

但是,我对如何映射输入属性感到茫然,因为需要另一个表

1 个答案:

答案 0 :(得分:0)

因为这是在数据库中表示这种情况的非标准方式,所以hibernate不支持这个ootb。

选项1:

// Function as wrapper around parts

Function getFunction(String code, Attribute outattr)
{
    List<FunctionPart> parts = session.createCriteria(FunctionPart.class)
        .add(Expression.eq("functionCode", code))
        .add(Expression.eq("outputAttribute", outattr))
        .list()

    return new Function(code, outattr, parts);
}

亲:简单 con:每个查询的函数,附加类,没有查询inattributes

选项2:

使函数成为假实体并依赖于属性

<class name="my.Function" table="FUNCTION_TABLE" schemaction="none" where="todo INPUT_ATTR_ID = (min INPUT_ATTR_ID of same id)">
    <id name="functionCode" column="FUNC_CD" type="java.lang.String" />
    <many-to-one name="outputAttribute" class="my.Attribute" column="OUTPUT_ATTR_ID"/>

    <sqlinsert>INSERT into TEMPTABLE</sqlinsert>
    <sqlupdate>INSERT into TEMPTABLE</sqlupdate>

    <set name="inputAttributes" class="my.Attribute" table="FUNCTION_TABLE" cascade="all">
      <key>
        <column name="FUNC_CD" />
        <column name="OUTPUT_ATTR_ID" />
      </key>
      <many-to-many class="Attribute" column="INPUT_ATTR_ID">
    </set>
</class>

亲:按照您的要求 con:hackish,不需要的join,如果不存在则必须创建临时表