JPA+Hibernate持久化数据:detached entity passed to persi

错误日志:

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.sdt.comm.business.authority.model.User
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
    ...
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.sdt.comm.business.authority.model.User
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:852)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:826)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:830)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:875)

问题原因:

    一个游离态的对象要被持久化(persist)时,其ID生成策略已由JPA配置为自动生成策略,但是该实体的ID此时已经有值。

    错误代码:

@Override
public String addUserTX() {
    User u = new User();
    BeanUtils.copyProperties(getObjVO(), u);
    u.setId(1L); //这里
    System.out.println("u.password->" + u.getPassword());
    userDAO.add(u);
    System.out.println("user save success!!!");
    return "添加用户成功";
}

解决办法:

    1. 删掉u.setId(1L);

    2. u.setId(null);

    以上两种办法均可。

你可能感兴趣的:(orm,jpa,Hibernate4,持久化)