Hibernate08_映射关系---OneToMany单向
来源:互联网 发布:安倍经济学 知乎 编辑:程序博客网 时间:2024/06/11 15:14
组和用户的关系–oneToMany
1.1、用户User, 多的一方
package com.chb.model;public class User { private int id; private String username; private String passwd; public User() {} public User(int id, String username, String passwd) { super(); this.id = id; this.username = username; this.passwd = passwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; }}
1.2、User.hbm.xml, 由于OneToMany,是在“一”的一方管理关系, 所以User.hbm.xml只需要关注自己的属性映射关系。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><!-- 映射对应的package --><hibernate-mapping package="com.chb.model"> <!-- 实体类User与数据库中表user_info对应 --> <class name="User" table="user_table"> <id name="id" column="user_id"> <!-- id主键, 设为自增 --> <generator class="native"></generator> </id> <property name="username" column="user_username"></property> <property name="passwd" column="user_passwd"></property> </class></hibernate-mapping>
1.3、实体类Group , “一”的一方, oneToMany 在”一”的一方对象中, 设置多的一方作为属性。
package com.chb.model;import java.util.Set;public class Group { private int id; private String groupName; //oneToMany 在"一"的一方对象中, 设置多的一方作为属性。 private Set<User> users; public Group(){} public Group(int id, String groupName, Set<User> users) { super(); this.id = id; this.groupName = groupName; this.users = users; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; }}
1.4、Group的映射文件,
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><!-- 映射对应的package --><hibernate-mapping package="com.chb.model"> <!-- 实体类Group与数据库中表group_info对应 --> <class name="Group" table="group_table"> <!-- id 主键, 设为自增 --> <id name="id" column="group_id"> <generator class="native"></generator> </id> <property name="groupName" column="group_name"></property> <set name="users"> <!-- 外键名称 --> <key column="group_id"></key> <!-- 对多关系对应的class --> <one-to-many class="com.chb.model.User"/> </set> </class></hibernate-mapping>
1.5、配置文件hibernate.cfg.xml
<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. --><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><!--one To Many使用 “一对多” 关系映射,因此我们在 “一” 的一方来描述,还需要添加一个 Group 属性。--><hibernate-configuration> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3307/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 --> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="com/chb/model/User.hbm.xml" /> <mapping resource="com/chb/model/Group.hbm.xml" /> </session-factory></hibernate-configuration>
1.6、测试添加
package com.chb.testgroup;import java.util.HashSet;import java.util.List;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.query.Query;import com.chb.model.Group;import com.chb.model.User;public class TestOneToMany { private SessionFactory sessionFactory; private Session session; public void getConnect() { Configuration config = new Configuration().configure(); // 根据 configuration 建立 sessionFactory sessionFactory = config.buildSessionFactory(); // 开启 session(相当于开启 JDBC 的 connection) session = sessionFactory.openSession(); //开启事务 session.beginTransaction(); } public void testOneToMany() { getConnect(); Group group = new Group(); group.setId(1); group.setGroupName("LOL"); //one to many 先添加“多”的一方 User u1 = new User(); u1.setUsername("chb"); u1.setPasswd("123456"); User u2 = new User(); u2.setUsername("tom"); u2.setPasswd("Net123!#"); Set<User> users = new HashSet<User>(); users.add(u1); users.add(u2); group.setUsers(users); for (User user : users) { session.save(user); } //然后添加"一"的一方 session.save(group); close(); } public static void main(String[] args) { TestOneToMany test = new TestOneToMany(); test.testOneToMany(); } /** * 关闭Sesson 相当于关闭JDBC的connection */ public void close() { if (session != null) { //提交事务 session.getTransaction().commit(); session.close(); } if (sessionFactory != null) { sessionFactory.close(); } }}
结果:会提交5条sql, 相对于manyToOne , 效率低一些。
特别注意: oneToMany在添加和维护关系比较麻烦, 所以在开发中, 不建议使用oneToMany的单向
1.7 、测试查询。
1.8、测试查询group中user的条数
1.8.1、使用lazy=extra, 稍微智能一些,会根据查询取得值的类型不同来判断是调用count还是投影
1.8.2、再次查询,注意sql变化
阅读全文
0 0
- Hibernate08_映射关系---OneToMany单向
- HIbernate关系映射--单向一对多@OneToMany
- 自己总结一下关联关系映射中的OneToMany,ManyToOne,单向,双向注意的事项!ps:例子
- Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式
- Hibernate09_映射关系---OneToMany双向
- 实体关系映射(一对多@OneToMany)
- Hibernate xml配置方法之OneToMany(单向关联关系)
- Hibernate 使用 Annotation 之 OneToMany(单向关联关系)
- Hibernate的单向关系映射
- Hibernate10_映射关系---OneToOne单向
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany
- @OneToMany或@ManyToOne的用法-annotation关系映射篇
- Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany
- Vue.js的computed和watch用法及区别
- 图解ARP协议(二)ARP攻击原理与实践
- leaflet加载百度地图(矫正篇
- Android 插件化基础——ClassLoader 源码解析
- MySQL事件(Event)
- Hibernate08_映射关系---OneToMany单向
- 【Python 学习笔记】文件写入时遇到 TypeError 报错
- Kali桥接模式DHCP自动获取IP失败(VMware)
- 神秘的咒语(Lcis)
- 如何连续读取多个以空格分开的数字?遇见回车结束?
- ArrayList
- c#-WinForm-按照学号精确查询对象
- 合唱队形(LIS)
- 从零开始读算法导论第三版 归并排序 LUA实现