第九章Hibernate映射一对一关联关系
- 共享主键关联
- 唯一外键关联
1.两个关联表使用相同的主键值
数据准备:
-- Create table
create table USERS1
(
USERNAME VARCHAR2(40),
PASSWORD VARCHAR2(40),
ID NUMBER(8) not null
)
Profile表用于保存用户的其他信息。
-- Create table
create table PROFILE
(
ID NUMBER(8) not null,
EMAIL VARCHAR2(200),
PHONE VARCHAR2(20),
MOBILE VARCHAR2(20),
ADDRESS VARCHAR2(200),
POSTCODE VARCHAR2(10)
)
其中,ID即是主键又是外键。因此称为共享主键。
User:
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String password;
private Profile profile;
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
User映射配置:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.crazy.User" table="USERS1" schema="SCOTT"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment"></generator> </id> <property name="username" type="java.lang.String"> <column name="USERNAME" length="40" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="40" /> </property> <one-to-one name="profile" class="com.crazy.Profile"></one-to-one> </class> </hibernate-mapping>
Profile类:
public class Profile implements java.io.Serializable {
private Integer id;
private String email;
private String phone;
private String mobile;
private String address;
private String postcode;
private User user;
public Profile() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return this.phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMobile() {
return this.mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPostcode() {
return this.postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
}
Profile映射配置:
其主键是使用user的。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.crazy.Profile" table="PROFILE" schema="SCOTT"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="foreign"> <param name="property">user</param> </generator> </id> <property name="email" type="java.lang.String"> <column name="EMAIL" length="200" /> </property> <property name="phone" type="java.lang.String"> <column name="PHONE" length="20" /> </property> <property name="mobile" type="java.lang.String"> <column name="MOBILE" length="20" /> </property> <property name="address" type="java.lang.String"> <column name="ADDRESS" length="200" /> </property> <property name="postcode" type="java.lang.String"> <column name="POSTCODE" length="10" /> </property> <one-to-one name="user" class="com.crazy.User"></one-to-one> </class> </hibernate-mapping>
测试代码:
public class HibernateTest {
public static void main(String args[]){
HibernateTest test = new HibernateTest();
test.add();
}
public void add(){
Profile profile = new Profile();
profile.setAddress("河南胜利路");
profile.setEmail("yesmeshtu2008@163.com");
profile.setMobile("13301239472145");
User user = new User();
profile.setUser(user);
user.setUsername("grass");
user.setPassword("123");
user.setProfile(profile);
Session session = new Configuration().configure().buildSessionFactory().openSession();
session.beginTransaction();
session.save(profile);
session.save(user);
session.getTransaction().commit();
}
}
2.多对一关联的特殊形式,要求多方唯一
User类:
public class User implements java.io.Serializable {
private Integer id;
private String username;
private String password;
private Profile profile;
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
User映射配置:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.crazy.User" table="USERS1" schema="SCOTT"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment" /> </id> <property name="username" type="java.lang.String"> <column name="USERNAME" length="40" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="40" /> </property> <one-to-one name="profile" class="com.crazy.Profile"></one-to-one> </class> </hibernate-mapping>
Profile类:
public class Profile implements java.io.Serializable {
private Integer id;
private String email;
private String phone;
private String mobile;
private String address;
private String postcode;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Profile() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return this.phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMobile() {
return this.mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPostcode() {
return this.postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
}
Profile映射配置:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.crazy.Profile" table="PROFILE1" schema="SCOTT"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment" /> </id> <property name="email" type="java.lang.String"> <column name="EMAIL" length="200" /> </property> <property name="phone" type="java.lang.String"> <column name="PHONE" length="20" /> </property> <property name="mobile" type="java.lang.String"> <column name="MOBILE" length="20" /> </property> <property name="address" type="java.lang.String"> <column name="ADDRESS" length="200" /> </property> <property name="postcode" type="java.lang.String"> <column name="POSTCODE" length="10" /> </property> <many-to-one name="user" class="com.crazy.User" unique="true"> <column name="user_id"></column> </many-to-one> </class> </hibernate-mapping>
配置如下:
<many-to-one name="user" class="com.crazy.User" unique="true"> <column name="user_id"></column> </many-to-one>
测试代码:
public class HibernateTest {
public static void main(String args[]){
HibernateTest test = new HibernateTest();
test.add();
}
public void add(){
Profile profile = new Profile();
profile.setAddress("河南胜利路");
profile.setEmail("yesmeshtu2008@163.com");
profile.setMobile("13309472145");
User user = new User();
profile.setUser(user);
user.setUsername("grass");
user.setPassword("123");
user.setProfile(profile);
Session session = new Configuration().configure().buildSessionFactory().openSession();
session.beginTransaction();
session.save(profile);
session.save(user);
session.getTransaction().commit();
}
}