[英]How to map foreign key relations in hibernate
I have customer class and Address class as below: officeAddressId,homeAddressId, and secondaryAddressId in Customer class are for foreign key mapping in tables. 我有如下的客户类和地址类:客户类中的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;
}
My database table is straight forward: 我的数据库表很简单:
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),
);
I make address objects (3 objects for address one for home,office and secondarycontact) and customer object at service layer and open transaction. 我在服务层创建地址对象(家庭,办公室和辅助联系人的三个地址对象)和客户对象,并进行交易。 I am not sure how should I give the foreign key relation in hbm mapping files and how do I save these four objects(3 address objects and 1 customer object) and in which order that the foreign key relations are persisted in database correctly.
我不确定如何在hbm映射文件中指定外键关系,以及如何保存这四个对象(3个地址对象和1个客户对象),以及按什么顺序将外键关系正确保留在数据库中。
Thanks in advance.... 提前致谢....
First, change name of your customer class to Customer. 首先,将您的客户类别的名称更改为Customer。 Then:
然后:
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;
...
}
and 和
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);
...
}
and of course you can create getter for all customers in Address class. 当然,您可以在Address类中为所有客户创建getter。
Here's an answer better tailored to your question. 这是一个更适合您问题的答案。
Assuming your *AddressId columns in the customer
table can be foreign keys, then you should map the relationship as a many-to-one
in your Customer
Hibernate mapping/class. 假设
customer
表中的* AddressId列可以是外键,那么您应该在Customer
休眠映射/类中将关系映射为many-to-one
关系。 (Note that Java classes should begin with capital letter.) (请注意,Java类应以大写字母开头。)
In Customer
class: 在
Customer
类别中:
//each of these with getters/setters
Address officeAddress;
Address homeAddress;
Address secondaryAddress;
In Customer.hbm.xml
file: 在
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"/>
Then, the explicit way to create/save these objects (perhaps in a DAO method) is to get access to a Hibernate Session
(via SessionFactory
), create/save the Address
objects, set those on the Customer
object, and then save it. 然后,创建/保存这些对象的明确方法(也许是DAO方法)是访问Hibernate
Session
(通过SessionFactory
),创建/保存Address
对象,在Customer
对象上设置这些对象然后保存。 Something like this: 像这样:
//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);
If you need to update which Address
entities a Customer
references, then get
the objects, set the correct Address
objects again, and save the Customer
: 如果您需要更新
Customer
引用的Address
实体,则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
Pretty verbose, but explicit and straightforward. 非常冗长,但明确而直接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.