User to Group, Many to One的关系

Test Case 1:

session.beginTransaction();
user.setGroup(group);
session.save(group);
session.save(user);
session.getTransaction().commit();

先保存group, 在保存user,没问题两条SQL INSERT语句发出来,数据库有数据,

Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (userId, userName) values (?, ?)

Test Case 2:

session.beginTransaction();
user.setGroup(group);
session.save(user);
session.getTransaction().commit();

先不保存group, 直接保存user,会有INSERT语句发出来,和TransientObjectException抛出。

原因是没有先保存关联的One那一端

Hibernate: insert into t_user (userId, userName) values (?, ?)

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.fm.entity.Group

结论,在ManytoOne中,必须先保存One的一端,因为没有One的一端,Many一端没地方依赖。

如果想能够单独保存,多的一端User,可以在ManyToOne前面加上optional=true,如下:

@ManyToOne(optional=true)
@JoinColumn(name="userId")
private Group group;

Group to User , One to Many的关系

在one to many的情况,下可以不先保存 group mapping的 user,直接保存group,没有问题。

session.beginTransaction();
session.save(group);
session.getTransaction().commit();

Hibernate: insert into t_group (name) values (?)

如果想保存一端的时候,顺带把另外一端也保存掉,使用如下注解:

@ManyToOne(cascade={CascadeType.ALL})

Hibernate ManyToOne, OneToMany的理解的更多相关文章

  1. 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?

    对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...

  2. Hibernate ManyToOne Mappings 多对一关联映射

    Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...

  3. Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

    1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model; import java.util.Date; ...

  4. 转Hibernate Annotation mappedBy注解理解

    在Annotation 中有这么一个@mappedBy 属性注解,相信有些同学还是对这个属性有些迷惑,上网找了些理解@mappedBy比较深刻的资料,下面贴出来供大家参考. http://xiaoru ...

  5. hibernate manytoone中的lazy EAGER

    Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZY Eager:全部抓取 Lazy:延迟抓取 如果在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关 ...

  6. 对spring,struts,hibernate及MVC的理解

    对于spring,hibernate,struts等框架,刚开始的时候总是会很迷茫,不知道他们是用来做什么的. 1.对框架的作用理解 个人认为框架的作用是把代码进行了分类,减少了代码的耦合性. 如果不 ...

  7. Hibernate:不容易理解的 lock 和 merge

    背景 lock 和 merge 在字面上很容易理解它们的语义,不过它们的实际行为所代表的语义范围要大一点,本文就简单的记录下来,还请朋友们多批评和指正. Lock 官方的注释 /** * Obtain ...

  8. @manyToOne.@oneToMany

    @ManyToOne注解的这端,是多端 1.在注释@ManyToOne(cascade=CascadeType.REFRESH,optional=true)中将属性optional设置为true,这可 ...

  9. spring+hibernate工作流程文件名理解

    reg.jsp regsuccess.jsp User.java UserDAO.java UserDAOImpl.java User.hbm.xml Reg.java RegImpl.java Re ...

随机推荐

  1. oracle 查询结果集运算

    intersec:交集minus:差集union:进行表连接后会筛选掉重复的记录,表连接之后对结果进行排序运算,删除重复记录在返回结果. union all:只是简单的将两个结果合并就返回.无论是否有 ...

  2. 通过代码自定义cell(cell的高度不一致)

  3. python不是内部或外部命令

    原因是环境变量没有添加. 比如python安装再C:\Python27 环境变量path增加C:\Python27即可,不需重启. 但是之前报错的cmd窗口需要重新打开再执行python命令

  4. 如何创建一个简单的C++同步锁框架(译)

    翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...

  5. LinQ 简单使用

    LinQ: 1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where以 ...

  6. spring boot 添加jsp支持注意事项

    1.一定要使用war包<packaging>war</packaging>2.将provided改为compile,具体如下: <dependency> <g ...

  7. getRemoteAddr()和getRemoteHost() 区别

    System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr()); System.out.prin ...

  8. AS配置IDE

    字体调整 settings->editor->colors&fonts->font,必须save as一个名称,个人选择Courier New字体,大小为14: 快捷键设置 ...

  9. CentOS配置本地光盘yum源

    在实际使用linux的过程中,会经常出现安装的发行版有的软件包没有安装的情况,这时,就需要用户从如下两种操作中做出选择:1.手动安装rpm包.2.用yum命令安装软件包. 选择1手动安装的时候经常会遇 ...

  10. 图像开发的p2s模式:halcon+opencv的联动

    [<zw版·Halcon与delphi系列原创教程> 图像开发的p2s模式:halcon+opencv的联动 尽管halcon功能强大,基本上cv只是halcon的一个子集,不过cv毕竟是 ...