Hibernate:如何将一对一映射到哪一个B是A的属性?

时间:2014-08-28 18:28:44

标签: java sql hibernate

我有一个A类,属性为B类。

A的SQL表对B没有任何了解。

B的SQL表包含A的外键。

如何映射(在hbm.xml中)以便B是A的属性?我知道如何使用Sets:

执行此操作
<set name="b" table="B" cascade"all-delete-orphan">
    <key column="a_id">
    <composite-element class="B">
        <property name="bProp" column="b_prop" type="string"/>
    </composite-element>
</set>

事情是,B不是一组A.而不仅仅是一个元素。我该如何映射这个?


编辑:为了澄清一点,我的用例类似于http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/associations.html#assoc-unidirectional-m21,除了代替:

create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )

我有:

create table Person ( personId bigint not null primary key )
create table Address ( personId bigint, addressId bigint not null primary key )

但是,我希望实际的Address Class不包含对Person的任何引用:

class Person {
    Address address;
}

class Address {
    int id;
}

2 个答案:

答案 0 :(得分:1)

我不是特别喜欢这个解决方案,但你可以通过使用几个包装器方法来解决这个问题。为未映射的属性创建一个假的getter / setter对,为您提供所需的接口。因此:

public class Person {
    private List<Address> addresses;
    // properties, real getters and setters

    public Address getAddress() {
        if (this.addresses == null || this.addresses.isEmpty()) {
            return null;
        }
        return this.addresses.get(0);
    }

    public void setAddress(Address address) {
        if (this.addresses == null) {
            this.addresses = new ArrayList<Address>();
        }
        this.addresses.clear();
        this.addresses.add(address);
    }
}

答案 1 :(得分:0)

如果其他人在遇到这样的情况时遇到麻烦,我终于弄明白了。只需使用

映射第二个表格
<join table="Address">
    <key column="personId">
        <component name="address" class="Address">
            <property name="id" column="addressId" type="int" />
        </component>
    </key>
</join>