hibernate之映射关系一对一(2种方式)
来源:互联网 发布:象棋软件排名 编辑:程序博客网 时间:2024/06/16 22:44
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"
"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(){}
....此处略去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"
"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());
}
}
- hibernate之映射关系一对一(2种方式)
- Hibernate表关系映射之一对一映射
- Hibernate关系映射之一对一关系
- Hibernate关联关系映射之一对一
- Hibernate入门之关系篇:一对一映射
- Hibernate进阶之双向一对一关系映射
- Hibernate(九)hibernate一对一关系映射
- Hibernate关系映射一对一
- hibernate 映射关系 一对一
- hibernate关系映射 一对一
- Hibernate一对一关系映射
- Hibernate一对一关系映射
- hibernate一对一映射关系
- Hibernate关系映射一对一
- hibernate映射关系一对一映射
- Hibernate关联关系映射(一对一关联)
- Hibernate(4) 一对一关系映射
- 【HIbernate框架学习】:Hibernate对象关系映射之一对一关联映射(一)
- Enabling table-level supplemental logging【每日一译】--20130105
- UITextField 键盘
- 流程控制Linux Shell
- windows占用端口情况
- 怎样获取jsp页面跳转参数
- hibernate之映射关系一对一(2种方式)
- Struts2 Annotation的<param-name>actionPackages</param-name>讲解
- send成功但是数据还在Send-Q中
- IOS 6.0 下 在输入中文时 按下锁屏键 导致的闪退问题
- 3D小人表我心!
- 23种设计模式(4):建造者模式
- 分享一段C#使用指针的代码!! 马赛克效果
- destoon首页如何调用文章所属栏目名称?
- Linux下循环结构while语句及until语句