JPA During synchronization a new object was found through a relationship that was not marked cascade

本文探讨了在使用JPA操作数据库时遇到的级联关系同步问题,特别是当通过关系找到新对象时引发的非法状态异常。提供了解决方法,即在@OneToMany、@ManyToOne或@ManyToMany注解中添加cascade属性,具体包括Persist、Merge和Refresh等选项,以确保级联操作的正确执行。

JPA 操作数据库,在级联关系中,会遇到如下问题:

nested exception is java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST


解决方法: 在@OneToMany 或 @ManyToOne 或 @ManyToMany 初加上 cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.REFRESH}


如:


@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE,CascadeType.REFRESH })
@JoinTable(name = "RECORD_RECORDER", joinColumns = { @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "RECORD_ID", referencedColumnName = "RECORD_ID") })
private List<Record> recorderRecords;

创建一个新的SqlSession通常是在Java中使用MyBatis框架操作数据库时的操作。当你尝试创建一个SqlSession,但遇到提示“was not registered for synchronization because synchronization is not active”时,这表明线程上下文并没有被正确地同步到Spring Data JPA或MyBatis-Spring等集成中的事务管理器。 这个问题通常是由于以下几个原因: 1. **未设置Spring事务管理**:你需要确保你在配置文件(如applicationContext.xml或application.yml)中启用了Spring的事务管理,并将其与你的数据访问层连接起来。 ```xml <tx:annotation-driven transaction-manager="transactionManager" /> ``` 2. **Transaction Propagation**:确认你的事务传播行为是否合适。如果你的代码在非Spring-managed环境中(比如在DAO直接调用SqlSession),需要显式开启事务。 3. **@Transactional注解缺失**:如果在方法级别使用MyBatis,记得在需要自动提交或回滚的方法上添加`@Transactional`注解。 4. **SqlSessionFactory或SqlSession错误初始化**:检查你的SqlSessionFactory是否正确初始化,并且在每次需要使用时是否都从这个工厂中获取新的SqlSession。 为了解决这个问题,你应该定位到代码中的具体场景,根据上述建议检查并调整事务管理、注解和配置。如果有疑问,可以在相关的Spring或MyBatis文档中寻找更多帮助,或者查看日志输出以找到更精确的问题根源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值