Hibernate ManytoMany 标注级联增删改查完整操作

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

我们在用户和角色的概念上经常要用到多对多关系本文综合全部情况统一进行说明

实现了的操作:

- 保存新增User用户的时候保存新的Role

- 新增User用户绑定已有Role后保存关系

- 删除用户时删除跟角色的对应关系

- 只有角色没有对应任何用户的时候才能删除角色

 

1. 类注解

User类

@ManyToMany(cascade={CascadeType.MERGE}) 
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
    private Set<Role> roles =new HashSet<Role>();
@ManyToMany(mappedBy="roles")
    public Set<User> users;


说明:级联操作必须使用MERGE, 同时在保存中使用Session.merge. 否则操作中的第二条不能完成。会出现如下错误

session.saveOrUpdate(session.merge(user));
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.***;
 


2. DAO

public void addUser(User user) {
    System.out.println("-------getinto UserDao--------");
    session=sessionFactory.getCurrentSession();
    //session.saveOrUpdate(session.merge(user));
    session.merge(user);
}
public void deleteUserById(int userID) {
    session=sessionFactory.getCurrentSession();
    User user=(User) session.get(User.class, userID);
    session.delete(user);
}
public void deleteRolebyId(int id) {
    session=sessionFactory.getCurrentSession();
    
    Role role=(Role) session.get(Role.class, id);
    session.delete(role);
}

另外,因为没有实现级联操作,需要在web.xml中使用OpenSessionInView

<!-- Open Seesion in View -->

	<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


@ManyToMany(多对多数据映射的insert、update及delete)  对hibernete只知道皮毛的偶,一直觉得在多表联合查询时配置hibernate数据表的映射文件很是麻烦的问题,最近难得有时间学习java annotation所以顺便更进一步的去学习一下hibernate,虽然我现在写这些东西在有好多人觉得是否开始有些过时,但是作为小鸟的我希望能将我的学习到的知识和经验与更多像我一样的小鸟们分享一下。那就废话少说了,这里我通过一个人员与角色的多对多实例, 阅读详情

相关推荐

hibernate many-to-many级联保存,级联更新,级联删除

hibernate many-to-many级联保存,级联更新,级联删除

Hibernate @ManyToMany 级联子查询

query.setPredicate(((root, criteriaQuery, criteriaBuilder, list, list1) -&gt; { //根据分类id查询中间表 过滤商品分类 Object categoryId = query.getParams().get("categories.id"); if (categoryId != null) {...

lemosen_025的博客 1071

@ManyToMany 联级删除

fetch = FetchType.EAGER 及时加载 联级删除必须加上  nullable = false, updatable = false  例如: @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) @JoinTable(name = "user__reference_role",  joinCol...

weixir123的博客 309

弄了两天终于明白了多对多当中的级联删除(是set集合而言)

1:多对多关系中如果没有设置级联删除而是简单的 @ManyToMany(cascade={CascadeType.REFRESH,CascadeType.MERGE},fetch=FetchType.LAZY) @JoinTable(name="roleaction",inverseJoinColumns={@JoinColumn(name="roleId")},joinColumns={@J

wangweiguang2的专栏 3305

manytomany级联与不级联删除问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34319999的博客 597

hibernate 注解 manytomany 级联删除问题

定义了两个类,Account 和 Department。是多对多关系,类定义如下; @Entity @Table(name = "ACCOUNTS") @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) public class Account { private Long id; private String log...

545

jpa 中@ManyToMany 标签使用后,只对关联表进行删除的写法

1. 表单结构 : 一个角色表TRole 一个菜单表TMenu一个角色-菜单表TRoleMenu 2.通过jpa生成pojo,用到了many2many 注释来表示关联关系后。只会生成2个实体pojo 类。中间关联表不会生成pojo类 [java] view plaincopy package com.alcor.acl.domain;

w2222288的专栏 6484

Hibernate级联实践之三(many-to-many)

 一。mapping使用三个表,分别为TBL_OSU_PRODUCT_I、TBL_OSU_BUSINESSFUNCTION_I和TBL_OSU_PRODUCTBUSINESS_C,1和2为多对多关系,3为其中间表1.TBL_OSU_PRODUCT_I"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">        

hanqunfeng的专栏 3853

Hibernate 双向ManyToMany 究极解决 新增-删除-修改-查询(1)

       近日拿起好久没碰的JAVA重新看了看,发现变化还真是大。在看Hiberhate时,发现他的ManyToMany用起来不是很方便,到网上一搜发现很多人都并没有完全了解这个关联关系的用法,为了造福人类,干脆我来个用例大全算了。          在使用Hiberhate的关联映射时,不管你是双向还是单向,都是有主控方的,主控方的操作会自动的影响关联关系(中间表),对于双向多对多来说,...

taomujian的专栏 519

Ebean中@ManyToMany多对多映射关系(注解)

最近自己做项目碰到一个需求: 不同的用户登录系统后根据用户的角色显示不同的菜单,一个用户可以拥有多个不同的角色,一个角色可以对应多个用户,这就是典型的----------多对多关系 表: 用户表 权限表 中间表 这里我的项目中已经引入了Ebean环境,不会的可以参照我的另一篇博文: springboot整合ebean 这里中间表设计有两点需要注意 1、中间表的表名必须是:多对多映射关系的两张...

sun_luming的博客 1374

关于hibernate的onetomany和manytomany

 1.one to many     (1)对于1这一方的操作与多的一方级联级 增加1时  可以普通的双增,也就是先new一的一方,在new多的一方的多个,把一的外键给多的几个实体,分别save一和多   要点  new了几个实体就要save几次 例如:  Dept dept=new Dept();         dept.setD_name("就业");                  Re

wanghexin701的专栏 1505

@OneToMany、@ManyToOne以及@ManyToMany讲解

双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side)。在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列。     publicclass Order implements Serializable {     privateSet&lt;OrderItem&gt; orderItems = new HashSet&...

dom_ee的博客 1919

一对多 单向维护(在一的一方),如果不要维护update关系

@OneToMany(cascade=CascadeType.PERSIST,targetEntity=DisaMedia.class,fetch = FetchType.EAGER)     @JoinColumn(name="RECORD_ID",updatable=false)

majian_1987的专栏 2359

ManyToMany关联映射

以下是两个实体类:用户类User和角色类Role,它们之间是多对多的关系。 //用户表 @Entity @Table(name="rong_user") public class User{     //省略其它内容     private SetRole> roles = new LinkedHashSetRole>();    //角色集合          @Ma

hello,黑豆先生 944

JPA ManyToMany双向关系

N:M(双向)关系维护端 publlic class Student{ public class Teacher{private Set<Teacher> teachers; private Set<Student> students;@ManyToMany(cascade=

Jc0803kevin的专栏 1612

Hibernate进行单向Many-to-Many映射时如果只删除一方及中间表,切忌莫加入Cascade

今天在作Employee->Role的单向多对多的映射时,不注意直接拷贝了One-to-Many的Cascade属性,导致在删除Employee时报外键错误,检查了一大圈最后才发现是自己拷贝了不应该有的东西.设置了Cascade导致其删除Employee前需要删除Role,而Role又和其它有关联,故没办法删除导致出错.哎......不可疏忽大意啊.

积硅步 1340

Hibernate注解之@ManyToMany

当两个类(a,b)使用@ManyToMany注解时,会产生一个中间表a_b,该中间表表示两个类的关联关系,此时有两种情况:只有一端(类)维护该关联关系,两端(类)均可维护该关联关系。现有一新闻类Label和一标签类News,其为多对多的关系,使用@ManyToMany注解情况一:只有一端(类)维护该关联关系若仅News端可维护该关联关系,则意为只能通过向News类对象的集合属性labels中添加La

qq_37720278的博客 4034

(转)ManyToMany注解

@ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。 例如,在Student类中有如下方法: 被控方: @ManyToMany(fetch = FetchType.LAZY, mappedBy = "students") public Set<Teacher>...

u012102536的博客 1万+
上一篇: Jquery实现类别的动态选择与删除
下一篇: Spring4 + Junit4 实现测试中ApplicationContext的获取
colourrain
博客等级 码龄12年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值