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

本文详细介绍了在Hibernate中处理ManytoMany关系的级联增删改查操作,包括保存新增用户时新建角色、为用户绑定已有角色、删除用户时解除角色关系,以及限制只有未被任何用户绑定的角色才能被删除。重点强调了在User类的级联操作注解以及DAO中使用Session.merge的重要性,并提示了在没有级联操作时需要配置OpenSessionInView。
摘要由CSDN通过智能技术生成

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

实现了的操作:

- 保存新增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 fl
在Spring Boot中,处理多表关联的增删改查(CRUD)操作通常涉及到JPA(Java Persistence API)或Hibernate这样的持久层框架,它们提供了方便的方法来操作数据库中的实体对象。以下是一个简要的步骤和示例: 1. **实体类(Entities)**: 定义包含多个字段的实体类,每个字段对应数据库表的一个列。如果涉及关联,使用`@ManyToOne`、`@OneToMany`、`@ManyToMany`或`@OneToOne`注解来声明关系。 ```java @Entity public class Order { @Id private Long id; private String name; @ManyToOne private Customer customer; // ... } @Entity public class Customer { @Id private Long id; private String name; // ... } ``` 2. **Repository接口**: Spring Data JPA提供了Repository接口,它是CRUD操作的基础。对于关联操作,你需要定义对应的接口方法,如`findAllByCustomer(Customer customer)`获取所有关联的订单。 ```java public interface OrderRepository extends JpaRepository<Order, Long> { List<Order> findByCustomer(Customer customer); } ``` 3. **服务类(Services)**: 在服务类中,调用Repository进行具体的操作。例如,添加订单时会创建一个新的Order对象并关联Customer。 ```java @Service public class OrderService { @Autowired private OrderRepository orderRepository; public void createOrder(Order order) { order.setCustomer(customer); // 假设customer已获取 orderRepository.save(order); } } ``` 4. **事务管理**: 使用Spring的事务管理来确保操作的原子性,特别是涉及多个表的修改。 5. **删除操作**: 删除时,可能需要先解除关联,然后删除关联对象。 6. **查询优化**: 使用延迟加载或预加载来提高性能,避免在每次查询时都从数据库获取关联数据。 **相关问题--:** 1. 如何在Spring Data JPA中执行复杂的多表联合查询? 2. 在Spring Boot中如何处理级联删除(Cascade delete)? 3. 怎样在Spring Boot中启用和配置延迟加载?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值