package com.itcast.jpa;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import com.itcast.jpa.domain.User;
public class BaseTest {
/**
* @param args
*/
public static void main(String[] args) {
User user = new User();
user.setId(1);
user.setName("zhangsan");
user.setBirthday(new Date());
addUser(user);
}
static void addUser(User user) {
EntityManager emf = null;
EntityTransaction tr = null;
try {
emf = JpaUtil.getEntityManager();
tr= emf.getTransaction();
tr.begin();
emf.persist(user);
tr.commit();
}finally {
if(emf !=null) {
emf.close();
}
}
}
}
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.itcast.jpa.domain.User
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:219)
at com.itcast.jpa.BaseTest.addUser(BaseTest.java:29)
at com.itcast.jpa.BaseTest.main(BaseTest.java:20)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.itcast.jpa.domain.User
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:213)
解决如下:因为在实体类中并没有设置主键增长方式而JPA默认的又是自动增长
所以插入的时候设置ID的话就会出现这个错误
在网上还有人说 @Id写错也会导致类似错误