org.hibernate.NonUniqueObjectException解决方法

用hibernate做修改和删除的时候,有时候会遇到org.hibernate.NonUniqueObjectException 异常,a different object with the same identifier value was alreadyassociated with the session可以解释为 有一个具有相同值的不同对象已经与和 session 相关联。

1. Session session= HibernateSessionFactory.getSession();  
 
2.  
 
3. // 加载OID为1L的对象,会被放在session缓存中 
 
4. LoanDetail detail =(LoanDetail)session.get(LoanDetail.class,1L); 
 
5.  
 
6. // new 一个OID也为1L的临时对象 
 
7. LoanDetail newDetail = new LoanDetail(1L); 
 
8. ewDetail.setSubjectId(1000L); 
 
9.  
 
10. // 持久化一个临时对象,试图放在session的缓存中,因OID冲突出现异常 
 
11. session.save(newDetail); 
 
12.  
 
13. // 执行saveOrUpdate同样会出现以上的异常 
 
14. // session.saveOrUpdate(newDetail); 


解决方法:
 
1) 如果用的 hibernate 2,需要在get/load/query到持久化对象,赋上新的属性值,再 save/update/saveOrupdate.
 
对以上代码就是:不能 new 一个session中已存在OID的对象,直接
 
detail.setSubjectId(1000L);
 
session.save(detail);
 
session.save()一个持久化对象时,会转化成update调用。

 
2) 使用 hibernate 3 的 merge 方法.session.merge(newDetail)即可,它会在 session缓存中找到持久化对象,把新对象的属性赋过去,再保存原session中的持久化对象。
 
如果在session或数据库中没有的对象,用merge方法的话,它也能够帮你把记录 insert到表中,相当于 save 方法。

http://blog.youkuaiyun.com/arthur0088/article/details/4760444


<think>好的,我现在需要解决用户提出的Hibernate注解包缺失问题,具体是org.hibernate.annotations包不存在。首先,我应该回忆一下Hibernate的基本结构和依赖管理。用户可能在使用Maven或Gradle这样的构建工具,或者手动添加了JAR包,但缺少必要的依赖。 首先,Hibernate的核心依赖通常包括hibernate-core,但注解相关的类可能分布在不同的模块中。根据引用[4]提到的Hibernate注解实战,注解主要分为javax.persistence和org.hibernate.annotations两类。用户的问题集中在org.hibernate.annotations包,所以需要确认是否引入了正确的Hibernate版本,并且相关模块已经包含在项目中。 接下来,检查用户是否在项目中正确配置了依赖。例如,在Maven项目中,需要在pom.xml中添加hibernate-core的依赖,这个依赖通常会自动包含注解相关的子模块。如果用户使用的是较旧的Hibernate版本(比如Hibernate 3.x),可能需要单独添加hibernate-annotations库,但Hibernate 4及以后版本已经将这些整合到核心库中。因此,用户可能使用了旧版本,或者依赖配置不正确。 此外,查看引用[2]提到的,用户可能混淆了javax.persistence和org.hibernate.annotations的包。虽然主要使用javax.persistence,但某些高级功能需要Hibernate特定的注解,这时候必须确保org.hibernate.annotations存在。 可能的解决步骤包括:1. 检查构建工具的依赖配置,确保hibernate-core版本正确。2. 如果使用Maven,添加或更新hibernate-core依赖。3. 确认项目中没有版本冲突,比如多个Hibernate版本导致类加载问题。4. 清理并重新构建项目,确保所有依赖已正确下载。 另外,引用[3]提到@Generated注解属于org.hibernate.annotations,如果用户需要使用这类特定注解,必须保证对应的JAR存在。如果用户手动管理依赖,可能需要下载hibernate-annotations的JAR并添加到类路径。 最后,用户可能需要检查IDE的构建路径,确保所有必要的库都已正确引入,没有遗漏。如果问题依旧,可能需要查看具体的错误日志,确认是否还有其他依赖缺失。</think>要解决Hibernate中$org.hibernate.annotations$包缺失的问题,需按以下步骤排查和修复: --- ### 1. **确认依赖配置** - **Maven项目**:在$pom.xml$中添加最新版Hibernate核心依赖(以6.x版本为例): ```xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.4.4.Final</version> </dependency> ``` 该依赖默认包含$org.hibernate.annotations$包[^4]。 - **Gradle项目**:在$build.gradle$中添加: ```groovy implementation 'org.hibernate:hibernate-core:6.4.4.Final' ``` - **手动引入**:若未使用构建工具,需从[Hibernate官网](https://hibernate.org/)下载完整JAR包(含$hibernate-core.jar$)并添加到项目类路径。 --- ### 2. **检查依赖范围与版本冲突** - **依赖范围**:确保依赖未设置为$provided$(如Tomcat容器自带旧版本可能冲突)。 - **版本兼容性**:避免混合使用不同版本的Hibernate和JPA API(如$javax.persistence$与$jakarta.persistence$)。Hibernate 6.x默认使用$jakarta.persistence$[^2]。 --- ### 3. **IDE清理与重建** - 执行清理操作(如Maven的$mvn clean install$或IDE的清理选项),确保依赖正确加载。 - 检查IDE的**项目结构配置**(如IntelliJ的`Project Structure > Modules > Dependencies`),确认无缺失JAR。 --- ### 4. **验证代码导入** 在Java类中尝试显式导入注解类: ```java import org.hibernate.annotations.Generated; import org.hibernate.annotations.Cache; ``` 若仍报错,说明依赖未正确引入。 --- ### 5. **特殊场景处理** - **Hibernate 3.x旧项目**:需单独引入$hibernate-annotations.jar$(已从Hibernate 4开始整合到核心库)。 - **混合使用JPA与Hibernate注解**:优先使用$javax.persistence$或$jakarta.persistence$的标准注解,仅在需要Hibernate特有功能(如`@FetchProfile`)时引入$org.hibernate.annotations$。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值