1

我有如下的客户类和地址类:客户类中的officeAddressId、homeAddressId 和secondaryAddressId 用于表中的外键映射。

  public class customer implements serializable
    {
    private static final long serialVersionUID= -5830229553758180137L;
    int age;
    String officeAddressId= null;
    String homeAddressId= null;
    String secondaryAddressId= null;
    }

public class Address implements serializable
{
        private static final long serialVersionUID= -5130229553758180137L;
        private String              addressId           = null;
    private String              addressLine         = null;
    private String              cityName            = null;
    private String              stateName           = null;
    private String              countryName         = null;
    private String              pincode             = null;
}

我的数据库表很简单:

CREATE TABLE customer
(
customerID varchar(40) primary key,
officeAddressId varchar(40),
homeAddressId varchar(40),
secondaryAddressId varchar(40),
age int 
);

CREATE TABLE Address
(
addressID varchar(40) primary key,
addressLine varchar(40),
cityName varchar(40),
stateName varchar(40),
countryName varchar(40),
pincode varchar(10),
);

我在服务层创建地址对象(家庭、办公室和次要联系人的地址 3 个对象)和客户对象并打开交易。我不确定如何在 hbm 映射文件中提供外键关系,以及如何保存这四个对象(3 个地址对象和 1 个客户对象)以及外键关系以何种顺序正确保存在数据库中。

提前致谢....

4

2 回答 2

1

首先,将您的客户类的名称更改为 Customer。然后:

public Class Customer implements Serializable {
    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "office_address_id")
    private Address officeAddress;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "home_address_id")
    private Address homeAddress;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "secondary_address_id")
    private Address secondaryAddress;

    ...
}

public Class Address implements Serializable {
    ...

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "officeAddress")
    private Set<Customer> officeCustomers = new HashSet<Customer>(0);

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "homeAddress")
    private Set<Customer> homeCustomers = new HashSet<Customer>(0);

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "secondaryAddress")
    private Set<Customer> secondaryCustomers = new HashSet<Customer>(0);

    ...
}

当然,您可以在 Address 类中为所有客户创建 getter。

于 2013-09-09T13:49:28.360 回答
1

这是一个更适合您的问题的答案。

假设表中的 *AddressId 列customer可以是外键,那么您应该many-to-oneCustomerHibernate 映射/类中将关系映射为 a。(注意 Java 类应该以大写字母开头。)

Customer课堂上:

//each of these with getters/setters
Address officeAddress;
Address homeAddress;
Address secondaryAddress;

Customer.hbm.xml文件中:

<many-to-one name="officeAddress" class="[package.name.]Address" column="officeAddressId"/>
<many-to-one name="homeAddress" class="[package.name.]Address" column="homeAddressId"/>
<many-to-one name="secondaryAddress" class="[package.name.]Address" column="secondaryAddressId"/>

然后,创建/保存这些对象的显式方法(可能在 DAO 方法中)是访问 Hibernate Session(通过SessionFactory),创建/保存Address对象,在对象上设置这些Customer对象,然后保存它。像这样的东西:

//in DAO create logic
Session session = sessionFactory.getCurrentSession(); //or openSession()
Address office = new Address();
Address home = new Address();
Address secondary = new Address();
//populate Address objects...
session.saveOrUpdate(office);
session.saveOrUpdate(home);
session.saveOrUpdate(secondary);
Customer customer = new Customer();
//populate Customer object...
customer.setOfficeAddress(office);
customer.setHomeAddress(home);
customer.setSecondaryAddress(secondary);
session.saveOrUpdate(customer);

如果您需要更新引用哪些Address实体Customer,然后get是对象,请再次设置正确的Address对象,然后保存Customer

//in DAO update logic
Session session = sessionFactory.getCurrentSession(); //or openSession()
Customer customer = (Customer) session.get(Customer.class, customerId);
Address address = (Address) session.get(Address.class, addressId);
customer.setOfficeAddress(address);
session.saveOrUpdate(customer); //updates officeAddressId column to value of addressId

相当冗长,但明确而直接。

于 2013-09-09T14:09:34.070 回答