1

我需要映射两个类 Person 和 PersonAudit:

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),但它似乎只有在 Employee表包含一个 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>

所以,多对一不是要走的路,我该如何解决这种情况?

任何帮助我将不胜感激,在此先感谢。

4

2 回答 2

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 回答
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 回答