双向多对一/一对多例子

维护关系一方为User:多方

不维护关系的一方为Group:一方

以下是多方代码:

package Hibernate_demo1.Demo8.Entity.OneToManyAndManyToOne.BiDirectional;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**
* @author pengys
* @date 2017/8/4
*/ @Entity
@Table(name = "users")
public class User { // 双向一对多/多对一映射; 双向多对一/一对多映射; 是一样的 @Id
@Column(name = "id")
@GenericGenerator(name = "gen", strategy = "uuid")
@GeneratedValue(generator = "gen")
private String id; @Column(name = "name")
private String name; // 维护关系的一方:
// 如果设置了group的值:
// 1. 有CascadeType.ALL会发出group的sql, group和user都保存成功;
// 2. 没有CascadeType.ALL, 由于本端维护关系, 所以会异常抛出(user对象引用了未保存的瞬时状态对象group), 除非你先手动持久化被维护关系的一方
// 如果没有设置group的值:
// 如果此关系是可选的option, 则允许保存但group为NULL
// 如果此关系不是可选的, 则不允许保存, 抛出异常
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "group_id")
private Group group; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Group getGroup() {
return group;
} public void setGroup(Group group) {
this.group = group;
}
}

以下是一方代码:

package Hibernate_demo1.Demo8.Entity.OneToManyAndManyToOne.BiDirectional;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List; /**
* @author pengys
* @date 2017/8/4
*/ @Entity
@Table(name = "groups")
public class Group { // 双向一对多/多对一映射; 双向多对一/一对多映射; 是一样的 @Id
@Column(name = "id")
@GenericGenerator(name = "gen", strategy = "uuid")
@GeneratedValue(generator = "gen")
private String id; @Column(name = "name")
private String name; // 不维护关系的一方:
// 如果设置了users的值: 根据是否有cascade属性来决定是否发起user的sql
// 1. 有CascadeType.ALL会发出group的sql, group和user都保存成功;
// 2. 没有CascadeType.ALL, 也不会异常抛出, 因为它不维护关系!!! 如果他要维护关系, 这必须取消mappedBy属性设置JoinColumn属性!!!
// 如果要维护关系, 取消了mappedBy属性却没有设置JoinColumn会导致第三张表(关系表)会被创建, 这不是双向多对一/一对多映射关系需要的
// 如果没有设置users的值: 该映射关系没有可选选项, 因为该表不存在外键, 所以可选不可选其实没有意义, 可见ManyToOne关联关系只是在Java这一层, 底层还是多方存外键
@OneToMany(mappedBy = "group", fetch = FetchType.EAGER)
// @JoinColumn(name = "group_id") // mappedBy 和此 属性只能二选一: 双向应该由多方管理, 这样才不会发出多余sql, 选择 mappedBy
private List<User> users = new ArrayList<>(); public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<User> getUsers() {
return users;
} public void setUsers(List<User> users) {
this.users = users;
}
}

以下是测试代码:

package Hibernate_demo1.Demo8;

import Hibernate_demo1.Demo8.Entity.OneToManyAndManyToOne.BiDirectional.Group;
import Hibernate_demo1.Demo8.Entity.OneToManyAndManyToOne.BiDirectional.User;
import Hibernate_demo1.Demo8.Util.HibernateUtils;
import org.hibernate.Session; /**
* @author pengys
* @date 2017/8/3
*/ public class TestOneToManyAndManyToOneBiDirectional { public static void main(String[] args) { Session session = null;
try { session = HibernateUtils.getSession();
session.beginTransaction(); Group grp = new Group();
grp.setName("group"); User user = new User();
user.setName("Test"); User user2 = new User();
user2.setName("C++"); // user.setGroup(grp);
// user2.setGroup(grp);
grp.getUsers().add(user);
grp.getUsers().add(user2); session.save(user);
session.save(user2);
// session.save(grp); // User user = session.get(User.class, "4028818f5db137a3015db137aaaf0000");
// System.out.println(user.getName());
// System.out.println("--------------------------------------------");
// System.out.println(user.getGroup().getName());
//
// Group grp = session.get(Group.class, "4028818f5db137a3015db137aab40001");
// System.out.println(grp.getName());
// System.out.println("--------------------------------------------");
// System.out.println(grp.getUsers()); session.getTransaction().commit(); } catch (Exception e) {
e.printStackTrace();
if (session != null) {
session.getTransaction().rollback();
}
} finally {
HibernateUtils.closeSession(session);
HibernateUtils.getSessionFactory().close();
} }
}

【hibernate学习杂记】维护关系的一方和不维护关系的一方的区别与联系的更多相关文章

  1. Hibernate学习(六)———— cascade(级联)和inverse关系详解

    序言 写这篇文章之前,自己也查了很多的资料来搞清楚这两者的关系和各自所做的事情,但是百度一搜,大多数博文感觉说的云里雾里,可能博主自己清楚是怎么一回事,但是给一个不懂的人或者一知半解的人看的话,别人也 ...

  2. Hibernate学习(四)———— 双向多对多映射关系

    一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设置吗? ...

  3. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  4. Hibernate学习之表一对多,多对一关系

    代码: person类: public class Person { private long id; private String name; private int age; private Da ...

  5. Hibernate学习之映射关系

    一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及g ...

  6. Hibernate学习笔记(四)—— 表与表的关系

    一.一对多|多对一 1.1 关系表达 1.1.1 表中的表达 建表原则:在多的一方创建外键指向一的一方的主键. 1.1.2 实体中的表达 [客户实体] public class Customer { ...

  7. 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】

    一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...

  8. Hibernate学习笔记(四)关系映射之一对一关联映射

    一. 一对一关联映射 ²        两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²        有两种策略可以实现一对一的关联映射 Ø        主键关联:即让 ...

  9. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

随机推荐

  1. layer 中的 layer.alert layer.msg layer.confirm

    1.layer.alert layer.alert('见到你真的很高兴', {icon: 6}); 效果图 layer.alert('墨绿风格,点击确认看深蓝', { skin: 'layui-lay ...

  2. [转] ASP.NET MVC 模型绑定的功能和问题

    摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术, ...

  3. web前端开发教程系列-4 - 前端开发职业规划

    前言 关于我:小天 1). 架构师,项目经理,产品经理 2). 中间件研发 3). VPCC 云计算基础平台管理 4). 智慧旅游 5). 智慧教育 6). 一次失败的创业体验(爱邂逅网) 一. 在开 ...

  4. C# 委托、匿名方法、扩展方法

    一.委托的使用: 详细委托和事件解释请看另一篇:http://www.cnblogs.com/Liyuting/p/6760706.html 二.匿名方法 三.扩展方法

  5. java8 lambda 表达式

    lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...

  6. Linux 文件缓存 (一)

    缓存印象 缓存给人的感觉就是可以提高程序运行速度,比如在桌面环境中,第一次打开一个大型程序可能需要10秒,但是关闭程序后再次打开可能只需5秒了.这是因为运行程序需要的代码.数据文件在操作系统中得到了缓 ...

  7. CSS中vertical-align的默认值baseline的理解

    写在前面的话 在学校业余学习了一个月的CSS,人生中第一篇博客就献给CSS了,欢迎大家指正文章中不正确的地方,在此感谢.在尝试开始写博客的时候查了好多资料,原本以为写自己熟悉的知识的博客很容易,没想到 ...

  8. oracel存储过程编写 以及plsql存储过程的debug

    1.语法: create or replace procedure messagebackup_createTable       //此处存储过程名称不能超过30个字符 as  tableName ...

  9. 使用catsup快速建立个人博客

    一.安装 time: 2016-01-2 20:30 1.使用pip安装catsup:(sudo) pip install catsup 从旧版本升级到新版本:(sudo) pip install c ...

  10. Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug

    这几天eclipse 项目迁移 android studio Error:Execution failed for task ':app:transformClassesWithJarMergingF ...