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(){}

....此處略去getset方法

public class UserClass {

private  String id;

private Integer classNo;

private double funds;

private String back;

private UserT user;

public UserClass(){}

....此處略去getset方法

4. 映射文件:

UserT .hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://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"

        "http://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(){}

....此處略去getset方法

public class UserClass {

private  String id;

private Integer classNo;

private double funds;

private String back;

private UserT user;

public UserClass(){}

....此處略去getset方法

3. 映射文件:

UserT .hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://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"

        "http://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());

}

}

 

發佈了46 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章