再用jpa+spring+struts2开发的是时候遇到一个问题(采用了注解的方式,xml配置的道理是一样的),当我在注册用户的时候,注册第一个用户没有问题,但注册第二个用户开始就会抛出一个异常:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.dalton.domain.User
org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException
(AbstractEntityManagerImpl.java:614)
org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
…………………………
在网上找了半天也没找到答案。
后来通过println找了原因,当我第二次插入用户的时候,还没有实例化到数据库就有了ID值,而且这个ID值是我第一次插入用户的ID,这是不正常,因为ID没有设置过,而且JPA默认的行为是只要指定了主键生成策略,主键就不能设置了,一旦不为空或者0就被认为是已经保存到了数据库中,一旦调用persist()方法就会抛出上面的异常。
为什么会还有第一次的插入用户的信息呢,原因就是我action的作用域设置错误了,我采用了默认单例的设置,对于Action来说必须采用prototype(每次调用创建一个对象)的作用域,修改方法是:在Action上就一个注解@Scope("prototype")
这样就OK了。
分享到:
相关推荐
javax.persistence.PersistenceException: detached entity passed to persist 当你尝试保存一个已经与JPA上下文断开连接(即处于“游离”状态)的实体时,会抛出此异常。在JPA中,只有处于托管状态的实体才能被...
在本文中,我们将探讨如何将Hibernate与Java Persistence API (JPA) 结合使用。首先,我们需要了解JPA的基本概念。 **1. 什么是JPA?** Java Persistence API (JPA) 是Java平台上的一个标准接口,它定义了用来管理...
- **Entity生命周期**:EntityManager管理Entity的四种状态:Transient、Persistent、Detached和Removed,分别对应新建、已持久化、已分离和已删除。 - **持久化Entity**:调用`persist()`方法将瞬时对象变为持久化...
4. 事务(Transaction):Hibernate支持JTA(Java Transaction API)和JDBC事务,确保数据操作的原子性、一致性、隔离性和持久性。 5. 联系(Association):包括一对一(One-to-One)、一对多(One-to-Many)、多对...
4. **JPA供应商**:包括Hibernate、OpenJPA、EclipseLink等,它们实现JPA规范,提供了各自的特性和服务。 5. **JPA技术**:包括实体管理、查询语言(JPQL)、 Criteria API、事务管理、事件监听等。 ### 二、JPA...
3. **持久化**:调用persist()方法可以使一个新的Entity进入持久化状态,即将其保存到数据库。 4. **获取**:find()方法可以根据主键从数据库中加载一个Entity。 5. **更新**:调用merge()方法可以将一个Detached...
在JPA开发过程中,可能会遇到如实体不存在、并发控制问题、数据一致性异常等错误。理解这些异常的含义并妥善处理是成功使用JPA的关键。 总结,JPA作为Java的持久化框架,简化了数据库操作,通过注解和元数据实现了...
<provider>org.hibernate.jpa.HibernatePersistenceProvider <class>com.example.User</class> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mydb"/> ...
JPA定义了四种实体状态:新建(New)、持久化(Managed)、游离(Detached)和删除(Removed)。理解这些状态有助于更好地控制实体的生命周期。 ### 9. **实体关系映射** JPA允许定义实体之间的关系,如一对一、一...
- **生命周期和状态**:Entity有四种状态:新建(New)、持久化(Managed)、游离(Detached)和删除(Removed),EntityManager负责管理这些状态转换。 - **持久化Entity**:`persist()`方法用于将瞬时对象持久化...
在Java Persistence API (JPA) 中,理解和掌握实体(Entity)的状态对于有效地管理数据库中的对象至关重要。本篇学习笔记主要探讨了JPA中实体的状态及其转换,包括New、Managed、Detached和Removed四种状态。 首先...
5. **Entity Manager 和 EntityManager Factory**: 虽然不是Hibernate原生的API,但在Java Persistence API (JPA) 中,EntityManager 和 EntityManagerFactory 分别对应于SessionFactory 和 Session。它们为...
1. 保存(Save/Insert):Hibernate提供Session的save()或persist()方法将对象插入数据库。save()方法适用于临时对象,会立即生成ID;而persist()方法则适用于关联对象,可能延迟到事务提交时才生成ID。 2. 更新...
4. 流程管理:JPA提供了三种实体管理状态:瞬时(Transient)、持久化(Persistent)和脱管(Detached)。实体从瞬时状态转变为持久化状态通常通过EntityManager的persist()方法完成,而从持久化到脱管则可以通过...
- **持久化(Persist)**:使用`entityManager.persist(entity)`将新创建的对象持久化到数据库。 - **获取(Find)**:`entityManager.find(Entity.class, id)`根据ID获取持久化实体。 - **更新(Merge)**:`...
5. **实体生命周期管理**:Hibernate EM提供了对实体完整生命周期的支持,包括持久化(persist)、加载(load)、更新(update)、删除(remove)以及游离态(detached)和托管态(managed)的转换,使得开发者可以...
- `persist()`:同`save()`,但适用于JPA规范,推荐使用。 - `update()`:更新对象,对象必须处于持久化或游离状态。 - `merge()`:将游离对象变为持久化,如果对象不存在则新建。 - `delete()`:标记对象为删除...
8. **实体生命周期**:Hibernate定义了五个状态(Transient、Persistent、Detached、Removed和Managed),并提供了相应的生命周期方法如`persist()`, `merge()`, `saveOrUpdate()`, `delete()`等来管理实体状态。...
10. **JPA集成**:Hibernate是Java Persistence API(JPA)的提供商之一,支持标准的JPA规范,使得项目可以在不依赖Hibernate特定API的情况下使用ORM功能。 在实际开发中,理解并熟练掌握这些知识点是充分利用...