一、双向关联级联保存客户订单

1、搭建环境,项目结构如下

2、代码及配置如下(数据库里订单表不能用order,因为order是数据库关键字)(客户外键cid和订单表外键cid要在配置中写一致)

package com.hjp.onetomany;

import java.util.HashSet;
import java.util.Set; /**
* Created by JiaPeng on 2016/1/2.
*/
public class Customer {
private int id;
private String name;
private Set<Order> orderSet=new HashSet<Order>() ; public Set<Order> getOrderSet() {
return orderSet;
} public void setOrderSet(Set<Order> orderSet) {
this.orderSet = orderSet;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", orderSet=" + orderSet +
'}';
}
}

Customer

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hjp.onetomany.Customer" table="customer">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="orderSet">
<key column="cid"></key>
<one-to-many class="com.hjp.onetomany.Order"></one-to-many>
</set>
</class>
</hibernate-mapping>

customer.hbm.xml

package com.hjp.onetomany;

/**
* Created by JiaPeng on 2016/1/2.
*/
public class Order {
private int id;
private double price;
private Customer customer=new Customer(); public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
} @Override
public String toString() {
return "Order{" +
"price=" + price +
", id=" + id +
'}';
}
}

Order

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hjp.onetomany.Order" table="orders">
<id name="id">
<generator class="native"></generator>
</id>
<property name="price"></property>
<many-to-one name="customer" class="com.hjp.onetomany.Customer" column="cid"></many-to-one>
</class>
</hibernate-mapping>

order.hbm.xml

package com.hjp.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /**
* Created by JiaPeng on 2016/1/2.
*/
public class HibernateUtils {
private static final SessionFactory sessionFactory;
static {
Configuration configuration=new Configuration().configure();
sessionFactory=configuration.buildSessionFactory();
}
public static Session getSession(){
return sessionFactory.openSession();
}
}

HibernateUtils

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">hjp123</property>
<!--设置c3p0-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--c3p0连接池配置信息-->
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">120</property>
<property name="c3p0.idle_test_period">3000</property>
<!--显示SQL并格式化-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--ddl生成策略,后面可以改为update-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!--导入映射文件-->
<!--<mapping resource="com/hjp/hbm/customer.hbm.xml"></mapping>-->
<mapping resource="com/hjp/onetomany/customer.hbm.xml"></mapping>
<mapping resource="com/hjp/onetomany/order.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

hibernate.cfg.xml

  @Test
public void func2() {
Session session = HibernateUtils.getSession();
session.beginTransaction();
//创建客户
Customer customer = new Customer();
customer.setName("张三");
//创建两个订单
Order order1 = new Order();
order1.setPrice(121);
Order order2 = new Order();
order2.setPrice(122);
//客户关联订单
customer.getOrderSet().add(order1);
customer.getOrderSet().add(order2);
//订单关联客户
order1.setCustomer(customer);
order2.setCustomer(customer);
session.save(customer);
session.save(order1);
session.save(order2);
session.getTransaction().commit();
session.close();
}

测试类中测试方法

二、配置中使用cascade,优化代码,单向关联完成客户和订单保存

注意:一般情况下配置上cascade后,只做单向关联即可,但是当我删除订单关联客户和保存订单的代码后总是报错save the transient instance before flushing,经各种检查后,无意间将上述Order类中的Customer类实例化方式删除后就好了

一般不需要在持久化类中实例化字段,订单类中也不需要,此处是为了方便使用

1、单向关联,只保存客户

在customer.hbm.xml中的set节点下配置cascade="save-update"即可

修改上述Order类

为:,即删除new Customer()

注释测试类中订单关联客户,和保存订单的代码,进行测试

2、单向关联,只保存订单

与单向关联,只保存客户相对

在order.hbm.xml 中的many-to-one节点设置cascade="save-update"即可

然后注释测试类中客户关联订单,和保存客户代码测试即可

三、cascade和inverse

cascade还有all-delete-orphan(all指save-update;delete-orphan级联删除和当前对象解除关系的对象)

inverse设置在set节点中,为true时表示由对方控制外键,为false时表示由自己控制外键

Hibernate之一对多(多对一)的更多相关文章

  1. 2018.11.4 Hibernate中一对、多对多的关系

    简单总结一下 多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件 一: 多: 操作: 操作管理级别属 ...

  2. hibernate中一对多多对一关系设计的理解

    1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...

  3. hibernate中一对多 多对多 inverse cascade

    ----------------------------一对多------------------------------------------- inverse属性:是在维护关联关系的时候起作用的 ...

  4. 用户、角色、权限三者多对多用hibernate的一对多注解配置

    用户.角色.权限三者多对多用hibernate的一对多注解配置 //权限表@Table(name = "p")public class P { @Id @GeneratedValu ...

  5. Hibernate一对多(多对一)关联关系

    上一篇博文总结了 Hibernate 的一对一的关联关系, 包括基于主键的单向一对一, 基于外键的单向一对一, 基于外键的双向一对一. 下面咱们说一下 Hibernate 的一对多关联关系. 其实一对 ...

  6. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  7. Hibernate 一对多/多对多

    一对多关联(多对一): 一对多关联映射: 在多的一端添加一个外键指向一的一端,它维护的关系是一指向多 多对一关联映射: 咋多的一端加入一个外键指向一的一端,它维护的关系是多指向一 在配置文件中添加: ...

  8. hibernate中配置单向多对一关联,和双向一对多,双向多对多

    什么是一对多,多对一? 一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多 多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是 ...

  9. Hibernate框架之双向多对多关系映射

    昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...

  10. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

随机推荐

  1. linux64需要增加的依赖库

    sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev gcc-multi ...

  2. Android应用性能优化之使用SparseArray替代HashMap

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  3. 【转】【C#】C# 不常用关键字

    1.__arglist 让我们先从__arglist开始. __arglist是用来给方法传送参数.通常我们是通过函数头部指定的参数列表给方法传递参数的.如果我们想要给方法传递一组新的参数,我们需要重 ...

  4. Discuz 取各排行榜数据

    取论坛指定版块帖子或回复(first=1 就是帖子的1楼, 如果=0 就是调用回复,fid=62 是论坛版块号): SELECT * FROM discuzx.pre_forum_post where ...

  5. 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)

    5.0的多线程任务包对于同步的性能方面有了很大的改进,在原有synchronized关键字的基础上,又增加了ReentrantLock,以及各种Atomic类.了解其性能的优劣程度,有助与我们在特定的 ...

  6. Objective-c内存管理

    cocoa中的内存管理机制 引用计数 每一个对象都拥有一个引用计数 当对象创建的时候,引用计数的值是1 当发生retain消息时,该对象的引用计数+1,该对象的引用计数为2 当向这个对象发送relea ...

  7. 直接修改托管堆栈中的type object pointer(类型对象指针)

    都知道.NET是一个强对象类型的框架. 那么对于对象类型又是怎么确定的呢. 最初的我简单认为数据的类型就是定义时字段的类型修饰决定的(回来发现这种观点是绝对错误的) 我们知道引用对象存储在托管堆栈中, ...

  8. storm如何保证at least once语义?

    背景 前期收到的问题: 1.在Topology中我们可以指定spout.bolt的并行度,在提交Topology时Storm如何将spout.bolt自动发布到每个服务器并且控制服务的CPU.磁盘等资 ...

  9. 『开源』仿SQLServer山寨一个 跨数据库客户端

    002 Laura.SqlForever项目简单介绍 相关文章 <『练手』001 Laura.SqlForever架构基础(Laura.XtraFramework 的变迁)> <『练 ...

  10. Sublime Text 3使用参考手册

    什么是Sublime Text? Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是 ...