hibernate之映射關係一對一(2種方式)
Hibernate實體關係映射
a) 一對一
i. 共享主鍵一對一方式:實現兩個表或對象使用同一主鍵的值、通過主鍵映射方式實現一對一的關聯
1. 使用範圍:一般確定一對一的關係不變化,比如:用戶登錄(賬號和密碼)、用戶詳細信息(名稱、性別、。。。)
2. 創建表:
create table t_user(
u_id varchar(255),
u_name varchar(255),
u_age Integer,
u_price double(5,2),
primary key(u_id)
);
create table t_user_class(
uc_id varchar(255),
uc_classNo Integer,
uc_funds double(5,2),
uc_back varchar(255),
primary key(uc_id));
3. java類
public class UserT implements Serializable{
private String id;
public String name;
private Integer age;
private double price;
private UserClass userclass;
public UserT(){}
....此處略去get、set方法
public class UserClass {
private String id;
private Integer classNo;
private double funds;
private String back;
private UserT user;
public UserClass(){}
....此處略去get、set方法
4. 映射文件:
UserT .hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wolf.pojo.oneToone" auto-import="false">
<class name="UserT" table="t_user">
<!-- 一對一:共享主鍵 -->
<id name="id" column="u_id">
<generator class="foreign">
<param name="property">userclass</param>
</generator>
</id>
<property name="name" column="u_name"/>
<property name="age" column="u_age"/>
<property name="price" column="u_price"/>
<!-- constrained=true :標識當前表的主鍵上存在外鍵 (子表-子類)-->
<one-to-one name="userclass" class="UserClass" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
UserClass .hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wolf.pojo.oneToone">
<class name="UserClass" table="t_user_class">
<id name="id" column="uc_id"/>
<property name="classNo" column="uc_classNo"/>
<property name="funds" column="uc_funds"/>
<property name="back" column="uc_back"/>
<!-- 主表:cascade="all" 保存主表數據級聯保存子表的數據 -->
<one-to-one name="user" class="UserT" cascade="all" lazy="false"></one-to-one>
</class>
</hibernate-mapping>
在此遇到一個問題,主表保存級聯保存子表,但是子表不能設置子表的ID主鍵,否則會拋出
Exception in thread "main" org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1的異常
程序代碼:
Session session= HibernateSessionFactory.getSession();
Transaction tr=session.beginTransaction();
UserT user=new UserT();
user.setId(UUID.randomUUID().toString());//此處不能設置id值
UserClass usercls=new UserClass();
usercls.setId(UUID.randomUUID().toString());
user.setUserclass(usercls);
usercls.setUser(user);
session.save(usercls);
tr.commit();
ii. 唯一外鍵方式
1. 創建表:
create table t_user(
u_id varchar(255),
u_name varchar(255),
u_age Integer,
u_price double(5,2),
uc_id varchar(255),
primary key(u_id)
);
create table t_user_class(
uc_id varchar(255),
uc_classNo Integer,
uc_funds double(5,2),
uc_back varchar(255),
primary key(uc_id));
2. java類
public class UserT implements Serializable{
private String id;
public String name;
private Integer age;
private double price;
private UserClass userclass;
public UserT(){}
....此處略去get、set方法
public class UserClass {
private String id;
private Integer classNo;
private double funds;
private String back;
private UserT user;
public UserClass(){}
....此處略去get、set方法
3. 映射文件:
UserT .hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wolf.pojo.oneToone" auto-import="false">
<class name="UserT" table="t_user">
<!-- 一對一:外鍵 -->
<id name="id" column="u_id">
</id>
<property name="name" column="u_name"/>
<property name="age" column="u_age"/>
<property name="price" column="u_price"/>
<many-to-one name="userclass" class="UserClass" column="uc_id" unique="true" lazy="false" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
UserClass .hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wolf.pojo.oneToone">
<class name="UserClass" table="t_user_class">
<id name="id" column="uc_id"/>
<property name="classNo" column="uc_classNo"/>
<property name="funds" column="uc_funds"/>
<property name="back" column="uc_back"/>
<one-to-one name="user" class="UserT" ></one-to-one>
</class>
</hibernate-mapping>
4. 測試代碼
package com.wolf.main;
import java.util.UUID;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.wolf.pojo.oneToone.UserClass;
import com.wolf.pojo.oneToone.UserT;
public class UtilMain {
public static void main(String[] args) {
Session session= HibernateSessionFactory.getSession();
Transaction tr=session.beginTransaction();
UserT user=new UserT();
user.setId(UUID.randomUUID().toString());
UserClass usercls=new UserClass();
usercls.setId(UUID.randomUUID().toString());
user.setUserclass(usercls);
usercls.setUser(user);
session.save(user);
tr.commit();
// System.out.println(((UserClass)session.get(UserClass.class, "8b69936a-cfe0-401a-a895-45f1df4422a4")).getUser().getId());
}
}
最後更新:2017-04-04 07:03:25