1

Person と PersonAudit の 2 つのクラスをマップする必要があります。

public class Person implements Serializable {

    private int id;
    private String name;
    private PersonAudit personAudit;

    public Person() {
    }

    //getters and setters omitted
}

public class PersonAudit implements Serializable {

    private int id;
    private Person person;
    private String name;
    private String user;
    private Date date;

    public PersonAudit() {
    }

    //getters and setters omitted
}

テーブル PersonAudit は、Person テーブルの履歴変更を保存します。

Person.personAuditプロパティをマップして、Person テーブルに実際には PersonAudit テーブルを参照する列がないことを考慮して、常に最後の監査登録を取得することは可能ですか?

私はEmployee-Employment-Organizationのドキュメントの例(http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#assoc-complex)に従っていますが、従業員の場合にのみ機能するようですテーブルには orgId 列が含まれています。

これまでの Person クラスのマッピングは次のとおりです。

<class catalog="test" name="test.Person" table="Person">
    <id name="id" type="int">
      <column name="Id"/>
      <generator class="increment"/>
    </id>
    <property name="name" type="string">
      <column length="30" name="Name" not-null="true"/>
    </property>

    <join table="PersonAudit"> 
        <subselect>
            select Id,IdPerson
            from PersonAudit
            group by IdPerson
            having Id = max(Id)
        </subselect>
        <key column="Id" />
        <many-to-one name="personAudit" class="test.PersonAudit" column="???"/>
    </join>
</class>

したがって、多対 1 は適していません。このシナリオをどのように解決できますか?

よろしくお願いします。

4

2 に答える 2

1

この種の関連付けをコンポーネントとしてマップする必要がある場合は、このシナリオを解決する別の方法があります。

<join table="PersonAudit" optional="true"> 
        <subselect>
            select pa.Id,pa.IdPerson,pa.Name,pa.User,pa.Date
            from PersonAudit pa
            where pa.Id = 
                ( select max(Id)
                    from PersonAudit
                    where IdPerson = Id)
        </subselect>    
        <key column="IdPerson" />
        <component name="personAudit" class="test.PersonAudit">
            <property name="id" column="Id"/>
            <property name="name" column="Name"/>
            <property name="user" column="USer"/>
            <property name="date" column="Date"/>
        </component>
</join>
于 2012-10-25T07:25:14.780 に答える
1

このシナリオには数式参照が適しています。私の頭の上から、それはどういうわけか次のように見えるはずです:

<many-to-one name="personAudit"
  formula="(SELECT Max(pa.Id) FROM PersonAudit pa WHERE pa.IdPerson = Id)" > 
</many-to-one>
于 2012-10-23T10:16:24.717 に答える