一对多

一对多 单向

@Entity
@Table(name = "cz_user")
public class Users {@Column(name = "user_id")@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer userId;@Column(name = "user_name")private String username;@Column(name = "email")private String email;@Column(name = "password")private String password;@Column(name = "reg_time")private Date regTime;@OneToMany(cascade = CascadeType.ALL,orphanRemoval = true)@JoinColumn(name = "user_id")//外键维护private List<Address> addressList = new ArrayList<Address>();public Users() {}//这里属性的get方法需要有,set方法不需要,当然你可以加上
@Entity
@Table(name = "cz_address")
public class Address {@Column(name = "address_id")@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer addressId;@Column(name = "consignee")private String consignee;@Column(name = "province")private Integer province;@Column(name = "city")private Integer city;@Column(name = "district")private Integer district;@Column(name = "street")private String street;@Column(name = "zipcode")private String zipcode;@Column(name = "telphone")private String telphone;@Column(name = "mobile")private String mobile;public Address() {}//这里属性的get方法需要有,set方法不需要,当然你可以加上
/**测试级联保存*/
@Transactional
@Overridepublic void test() {List<Address> addresses = new ArrayList<Address>();Address consignee1 = new Address("consignee12", 12, 12, 12);Address consignee2 = new Address("consignee22", 22, 22, 22);Address consignee3 = new Address("consignee32", 32, 32, 32);Address consignee4 = new Address("consignee42", 42, 42, 42);addresses.add(consignee1);addresses.add(consignee2);addresses.add(consignee3);addresses.add(consignee4);Users users1 = new Users(null, "username2", "email2", "password2", new Date(), addresses);userAddressDao.saveUser(users1);if (addresses != null && addresses.size() > 0){for (Address address : addresses) {userAddressDao.updateAddress(address,users1.getUserId());}}}
public void saveUser(Users users) {getCurrentSession().save(users);}
@Overridepublic void updateAddress(Address address,int user_id) {int o = getCurrentSession().createQuery("update "+Address.class.getName()+" set user_id = :user_id where addressId = :addressId").setParameter("user_id",user_id).setParameter("addressId",address.getAddressId()).executeUpdate();logger.warn("外键成功:" + o);}

这种单向一对多的级联保存,只需要保存"一方",保存成功之后,“一方”,"多方"的主键会自动回填,然后再去更新外键。这种单向的一对多情况下,"多方"基本上我们是使用不到的。

一对多 双向

@Entity
@Table(name = "cz_user")
public class Users {@Column(name = "user_id")@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer userId;@Column(name = "user_name")private String username;@Column(name = "email")private String email;@Column(name = "password")private String password;@Column(name = "reg_time")private Date regTime;@OneToMany(cascade = CascadeType.ALL,orphanRemoval = true,mappedBy = "users")private List<Address> addressList = new ArrayList<Address>();public Users() {}//这里属性的get方法需要有,set方法不需要,当然你可以加上
@Entity
@Table(name = "cz_address")
public class Address {@Column(name = "address_id")@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer addressId;@Column(name = "consignee")private String consignee;@Column(name = "province")private Integer province;@Column(name = "city")private Integer city;@Column(name = "district")private Integer district;@Column(name = "street")private String street;@Column(name = "zipcode")private String zipcode;@Column(name = "telphone")private String telphone;@Column(name = "mobile")private String mobile;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "user_id")//外键private Users users;//这里属性的get方法需要有,set方法不需要,当然你可以加上
@Transactional@Overridepublic void test() {List<Address> addresses = new ArrayList<Address>();Address consignee1 = new Address("consignee12", 12, 12, 12);Address consignee2 = new Address("consignee22", 22, 22, 22);Address consignee3 = new Address("consignee32", 32, 32, 32);Address consignee4 = new Address("consignee42", 42, 42, 42);addresses.add(consignee1);addresses.add(consignee2);addresses.add(consignee3);addresses.add(consignee4);Users users1 = new Users(null, "username2", "email2", "password2", new Date(), addresses);userAddressDao.saveUser(users1);if (addresses != null && addresses.size() > 0){for (Address address : addresses) {userAddressDao.updateAddress(address,users1.getUserId());}}}
  @Overridepublic void saveUser(Users users) {getCurrentSession().save(users);}@Overridepublic void updateAddress(Address address,int user_id) {int o = getCurrentSession().createQuery("update "+Address.class.getName()+" set user_id = :user_id where addressId = :addressId").setParameter("user_id",user_id).setParameter("addressId",address.getAddressId()).executeUpdate();logger.warn("外键成功:" + o);}

这种单向一对多的级联保存,只需要保存"一方",保存成功之后,“一方”,"多方"的主键会自动回填,然后再去更新外键。这种双向的一对多情况下,是使用最多的
上面两种情况的执行结果

Hibernate: insert intocz_user(email, password, reg_time, user_name) values(?, ?, ?, ?)
Hibernate: insert intocz_address(city, consignee, district, mobile, province, street, telphone, user_id, zipcode) values(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert intocz_address(city, consignee, district, mobile, province, street, telphone, user_id, zipcode) values(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert intocz_address(city, consignee, district, mobile, province, street, telphone, user_id, zipcode) values(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert intocz_address(city, consignee, district, mobile, province, street, telphone, user_id, zipcode) values(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: updatecz_address setuser_id=? whereaddress_id=?
2021-11-16 15:07:33,193 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
Hibernate: updatecz_address setuser_id=? whereaddress_id=?
2021-11-16 15:07:33,221 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
Hibernate: updatecz_address setuser_id=? whereaddress_id=?
2021-11-16 15:07:33,251 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
Hibernate: updatecz_address setuser_id=? whereaddress_id=?
2021-11-16 15:07:33,309 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1

Hibernate一对多和多对多相关推荐

  1. 使用Hibernate,一对多和多对一的实现(双向).

    在这里,我们分别通过配置文件的方式和写注释的方式来创建表. 例子: 现在有一个顾客表和一个订单表,一个顾客可以拥有多个订单,而每个订单只能从属于一个客户,这就是一对多的意思. 顾客的字段 privat ...

  2. hibernate 一对多、多对多的配置

    一对多<class name="Question" table="questions" dynamic-insert="true"dy ...

  3. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射--一对多(多对一) 我们以客户(Customer)与 ...

  4. Hibernate第四篇【集合映射、一对多和多对一】

    前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...

  5. hibernate映射(单向双向的一对多、多对一以及一对一、多对一(转)

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...

  6. 【SSH】Hibernate学习(三)一对多、多对一、多对多

    一.一对多,多对一 1.表及实体的表达 2.映射文件中的配置: 3.操作关联属性 public class Demo {@Test//保存客户以及客户下的联系人public void fun1() { ...

  7. 关于一对多,多对多的多表查询的控制

    一.一对多 以班级Classes和学生Student为例: 回忆sql语句: //内链接,两种方式效果一样,查询的是两边都有的数据 SELECT c.*,s.* FROM classes c,stud ...

  8. java框架篇---hibernate(一对多)映射关系

    一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...

  9. Hibernate 关联映射 之 多对多 关联(二) 之拆分

    1.由问题引出一个多对多拆分成两个多对一 问题:Hibernate 关联映射 之 多对多 关联(一)中中间表只是一个存放用户和角色的表,并无其他作用,如果客户有其他的需求,该表就无法扩展. 2.问题解 ...

最新文章

  1. 【Sql Server】DateBase-高级查询
  2. [Cocos2d-x]视差滚屏效果的实现
  3. kubenetes kubectl命令记录
  4. 爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
  5. NS安装问题收集(2)
  6. AS 3.0小事件处理 八
  7. python序列化持久化需要注意的一个问题
  8. OpenCV_006-OpenCV 轨迹栏作为调色板
  9. android读写文件的,Android读写文件
  10. python接口测试demo_python http接口自动化测试简单demo
  11. rust语法丑陋_抛出异常–缓慢而丑陋
  12. python invalid literal for int_求助!运行出现错误“ValueError: invalid literal for int() ··...
  13. PyTorch 1.0 中文文档:torch.nn.init
  14. POJ 3126 Prime Path 简单广搜(BFS)
  15. P2326 AKN’s PPAP
  16. java去除对象属性空格_JAVA 对象中去除空格
  17. 测试经验总结分享(长期更新)
  18. 关于DBF文件格式的详细说明
  19. uni-app设置背景图片,backgroundImage
  20. 最牛逼的java代码_分享史上java最牛逼 最简短的代码-Go语言中文社区

热门文章

  1. android camera 曝光度,相机曝光度是什么意思(数码相机的曝光原则及时间单位)...
  2. because there was insufficient free space available after evicting expired cache entries - consider
  3. 超星存在的xss——分享
  4. 怎样的一种灵魂--Michael Jackson逝世
  5. 在Vue3项目中使用 Echarts 绘制股票图表的分享(五):分时图的基础上绘制出五日图
  6. MQTT | Windows + mosquitto搭建MQTT Broker(本地服务器)与MQTTX客户端联调
  7. 软骨鱼新增SSL证书销售功能,一键开通证书官网,自购省钱,外销赚钱
  8. 什么是AAA信用等级证书?有哪些好处?怎么办理呢?
  9. 智能化配电室的应用与研究
  10. teleop_twist_keyboard安装