0

考虑我的数据库中的以下 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

我的 Function 类应包含以下内容:

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

然后,我的 Function 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>

但是,我不知道如何根据需要映射另一个表的输入属性

4

1 回答 1

0

因为这是在数据库中表示它的非标准方式,所以休眠不支持这个 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);
}

pro:简单 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>

亲:根据您的要求 缺点:hackish,不需要的连接,如果不存在则必须创建临时表

于 2012-05-18T12:17:38.863 回答