【hibernate学习杂记】维护关系的一方和不维护关系的一方的区别与联系
2017-08-05 15:22
302 查看
双向多对一/一对多例子
维护关系一方为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源代码角度解析, 关系维护 ,dirty检查 ,脏数据检查.. 级联区别 cascade区别.
- SSH与SSM学习之hibernate19——多对一一对多关系维护
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- Hibernate学习之createSQLQuery与createQuery的区别及使用
- 新手学习C++笔记7:结构体、联合体的区别与联系
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别(转)
- Html学习笔记 --- Html与Htm区别与联系
- Hibernate 3.2 学习笔记 映射继承关系
- 一对多 单向维护(在一的一方),如果不要维护update关系
- 【iOS知识学习】_int、NSInteger、NSUInteger、NSNumber的区别和联系
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- Hibernate的学习之路二十五(cascade和inverse的区别)
- 系统学习jQuery.核心知识.FAQ.jQuery对象与DOM对象区别与联系
- 转载:UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- mybatis学习笔记(三)mybatis和hibernate区别
- OC内存内部组成部分,栈与堆的主要区别和联系,copy,mutableCopy与深拷贝,浅拷贝的关系
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- 框架学习之hibernate-02实体与实体之间的关系