最近做的项目中遇到很多各种表间关系是一对多对应的问题,开始自己弄的时候就去网上查,结果发现网上有关这方面的东西给的不是自己想要的,于是经过几天不停的更改测试终于算是勉强完成了级联更新的问题。在此把它记录下来以便日后复用

   先描述下问题。一个用户表tb_app_user,一个职业技能表tb_app_wl,一个特殊技能表tb_app_special,关系为用户表和职业技能表时一对一的关系,而一个职业技能表包含多个特殊技能即为一对多的关系。其实简单的只拿职业技能表和特殊技能表来说明问题就好。问题是在实际项目中职业技能表不可能单独存在,他必须需要关联自己的用户。因此还是把tb_app_user也拿出来了。如图为指导关系。

     用户在注册后会自动拥有这张tb_app_wl的表格,而tb_app_wl中也会包含三个tb_app_special,这种使用Hibernate中的级联操作很简单就可以实现。

持久类User:

@Entity(name = "TB_APP_USER")
@SelectBeforeUpdate(value = true)
@OptimisticLocking(type = OptimisticLockType.VERSION)
@Polymorphism(type = PolymorphismType.EXPLICIT)
@GenericGenerator(name = "systemUUID", strategy = "uuid")
public class User extends BaseObject {private static final long serialVersionUID = -3027223712328553788L;public static String user_name = "name";@Id@GeneratedValue(generator = "systemUUID")@Column(name = "ID")private String id;@OneToOne(mappedBy = "user", cascade = CascadeType.PERSIST)private WL wl;public WL getWl() {return wl;}public void setWl(WL wl) {this.wl = wl;}public String getSysId() {return id;}public void setSysId(String sysId) {this.id = sysId;}
}

cascade=CascadeType.PERSIST的意思是在执行persist()这个方法的时候会级联执行与他关联的数据插入操作。简单来说就是我注册一个用户User后,关联它的职业技能也会创建。下面列出WL持久类的实例

@Entity
@Table(name = "tb_app_wl", catalog = "hrborse")
@GenericGenerator(name = "wl", strategy = "uuid")
public class WL extends BaseObject {private static final long serialVersionUID = 1L;private String id;private User user;private Set<Special> speciallist = new HashSet<Special>();@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "wl")public Set<Special> getSpeciallist() {return speciallist;}public void setSpeciallist(Set<Special> speciallist) {this.speciallist = speciallist;}@Id@GeneratedValue(generator = "wl")@Column(name = "id")public String getId() {return this.id;}public void setId(String id) {this.id = id;}@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "user_id")public User getUser() {return this.user;}public void setUser(User user) {this.user = user;}
}

持久类 Special

@Entity
@Table(name = "tb_app_special", catalog = "hrborse")
@GenericGenerator(name = "special", strategy = "uuid")
public class Special extends BaseObject {private static final long serialVersionUID = 1L;private String id;private WL wl;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "wl_id")public WL getWl() {return wl;}public void setWl(WL wl) {this.wl = wl;}@Id@GeneratedValue(generator = "special")@Column(name = "id")public String getId() {return this.id;}public void setId(String id) {this.id = id;}}

然后把执行级联操作代码贴出来

public String register() {User user = new User();user.setName(name);user.setEmail(email);user.setModifiedBy("SYS");WL wl = new WL();Set<Special> specialList = new HashSet<Special>();Special special1 = new Special();Special special2 = new Special();Special special3 = new Special();special1.setWl(wl);special2.setWl(wl);special3.setWl(wl);specialList.add(special1);specialList.add(special2);specialList.add(special3);wl.setUser(user);wl.setSpeciallist(specialList);user.setWl(wl);userService.registerUser(user);return SUCCESS;}

注意set方法的对应,这样子在注册一个用户后就数据库里也会拥有wl和special的数据,他们都拥有主键以及关联的外键,但是其他数据都是null,接下来就是更新着写null的数据,拿我们的新数据update,对于wl,我们登录后可以由:user.getWl().getId获得,但是无法获得special因为它是多个属性不可能从这里获取,所以需要按照special关联的外键wl_id查出所有的special,然后遍历放入相应的wl属性中,最后只对wl进行更新便可完成对其对应special的更新,这样的好处就是用户单击保存信息后不会无限创建新表了。

public String saveWL() {User user = (User) session.get("user");int count=0;Set<Special> listspecial = new      HashSet<Special>();wl.setId(user.getWl().getId());wl.setUser(user);wl.setWSw(wsw);wl.setSkillCertificate(skillcertificate);wl.setCertificate(certificate);wl.setLanguage(language);wl.setLiteracy(literacy);wl.setListenSkill(listenskill);String id = wl.getId();List<Special> lis = wlService.findSpecialListById(id);for (Special specials : lis) {if(count==0){special.setId(specials.getId());special.setWl(wl);listspecial.add(special);}if(count==1){special2.setId(specials.getId());special2.setWl(wl);listspecial.add(special2);}if(count==2){special3.setId(specials.getId());special3.setWl(wl);listspecial.add(special3);}count++;}wl.setSpeciallist(listspecial);user.setWl(wl);wlService.updateWL(user.getWl());return SUCCESS;}

转载于:https://www.cnblogs.com/wq123/archive/2013/01/11/2856997.html

关于hibernate注解方法中一对多的级联更新相关推荐

  1. KSQL中Update多表级联更新的语法

    Update XXX Set FXXX = ( Select ① From ... Where ②) Where ③ Update里必须包括3个逻辑部分: a.) 在①里指明把字段更新为什么值,即新值 ...

  2. (转) Hibernate注解开发

    http://blog.csdn.net/yerenyuan_pku/article/details/70162268 Hibernate注解开发 在Hibernate中我们一般都会使用注解,这样可以 ...

  3. 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(六): 一些常用的数据库 注解...

    一. 实体 Bean 每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明. 声明实体Bean @Entity public class Flight im ...

  4. 如何在注解上拿到方法中的参数_想自己写框架?不会写Java注解可不行

    用注解一时爽,一直用一直爽 Java后端开发进入spring全家桶时代后,开发一个微服务提供简单的增删改查接口跟玩泥巴似的非常简单,一顿操作猛如虎,回头一看代码加了一堆注解:@Controller @ ...

  5. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

  6. java自定义方法参数注解_Java方法中的参数太多,第1部分:自定义类型

    java自定义方法参数注解 我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当 ...

  7. java 注解 方法 参数_java在注解中绑定方法参数的解决方案

    我们有这样子的需求,需要记录用户操作某个方法的信息并记录到日志里面,例如,用户在保存和更新任务的时候,我们需要记录下用户的ip,具体是保存还是更新,调用的是哪个方法,保存和更新的任务名称以及操作是否成 ...

  8. Spring同一个类中注解方法互相调用的问题

    在使用Spring时,很多初学者不了解Spring对象注入的机制和面向切面编程的原理,很容易犯一些错误.下面就是初学者最容易犯的错误.举例如下: @Component public class Tes ...

  9. Hibernate 注解 实现一对多

    首先,我们知道,班级与学生是一对多关系.笔者就以此来编写Hibernate注解实现一对多关系. 先上[班级]类:Clazz.java (这里千万不要用class,否则你懂得...),代码如下: pac ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task09. 环形链表
  2. 南京大学计算机2010年本科录取名单,2010高考本科录取名单
  3. java query类是什么类_java – 从包生成QueryDsl Q类
  4. npm镜像源的查看和切换
  5. 有关函数模板和类模板的说法
  6. 10+ commonly using find command switches with example Unix/Linux
  7. XHTML学习笔记 Part2:核心元素
  8. BFPTR算法详解+实现+复杂度证明
  9. android正则判断两个符号之间,Android字母、数字、字符任意两种组合正则验证
  10. java javah_Java开发网 - 一个javah的问题
  11. java线程立刻执行_Java 线程调用start()后会立即执行run()方法吗?
  12. 威马汽车否认接盘ST众泰:没有任何兴趣参与
  13. Windows下hadoop配置
  14. 在定语从句中which和that用法有什么区别
  15. 2020哔哩哔哩校招前端笔试编程题
  16. 计算机网络ppp,计算机网络 第7章 PPP和Internet接入.ppt
  17. python学习---day6
  18. 生活中的定律之蝴蝶效应
  19. 第四章 道德经第四章原文 道德经第四章译文
  20. 海信变频空调室外机工作异常分析与检修案例

热门文章

  1. Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
  2. LuaForUnity10:框架配置与AssetBundle
  3. LuaForUnity8:uLua简介
  4. Unity3D基础6:灯光组件
  5. 牛客网暑期ACM多校训练营(第十场): H. Rikka with Ants(类欧几里得)
  6. HDU 6162 2017 多校训练:Ch's gift(树链剖分)
  7. python机器学习库sklearn——朴素贝叶斯分类器
  8. Ubuntu用ssh连接虚拟机
  9. 汇编语言上机考试三星题——判断一个不超过65535的整数是否为质数
  10. C语言学习记录_2019.02.10