10

我正在尝试使用 Hibernate EntityManager persist 方法将人 pojo 插入 mysql db,

entityManagerTransactionService.getEntityManager().persist(TemplateObject);

并得到这个例外,

 javax.persistence.PersistenceException:
 org.hibernate.PersistentObjectException: detached entity passed to
 persist: com.esupu.base.model.pojo.common.TitleType    at
 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)....

还有更多..

 Caused by: org.hibernate.PersistentObjectException: detached entity
 passed to persist: com.esupu.base.model.pojo.common.TitleType  at
 org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
    at
 org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)

我的 Person.java 类是,

@Entity
public class Person extends TemplateObject {

    @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REFRESH })
        private TitleType titleType;
        private String middle;
        private String last;
        @OneToOne(cascade = { CascadeType.ALL })
        private Address address;
        private Date birthdate;
        private String email;
        private String telephone;
        private String fax;
        @OneToOne(cascade = { CascadeType.ALL })
        private Location location;
        @OneToOne(cascade = { CascadeType.ALL })
        private Country country;

然后是 pojo 的 getter setter 方法 ..

抛出 TitleType 类的错误是“公共静态最终”标题类型定义提供程序,

@Entity
public class TitleType extends TemplateObject {

    /**
     * 
     */
    private static final long serialVersionUID = 3104954552111621034L;

    private TitleType(int id, String name) {
        setId(id);
        setName(name);
    }

    public static final TitleType MR = new TitleType(1, "Mr");
    public static final TitleType MISS = new TitleType(2, "Miss");
    public static final TitleType MRS = new TitleType(3, "Mrs");
    public static final TitleType MS = new TitleType(4, "Ms");
    public static final TitleType DOCTOR = new TitleType(5, "Doctor");
    public static final TitleType PROFESSOR = new TitleType(6, "Professor");
    public static final TitleType SIR = new TitleType(7, "Sir");
    public static final TitleType MADAM = new TitleType(8, "Madam");

}

我将标题类型类设置为该人,

person.setTitleType(TitleType.MR);

是否不可能将公共静态最终类型定义的类传递给 Hibernate?还是我做错了什么?

提前致谢

4

2 回答 2

21

您尝试保留的对象包括TitleType不应具有ID值的对象。否则 Hibernate 将检查该对象是否在会话上下文中是持久的或分离的。如果您不想像这样持久化对象的某些字段,则可以@Transient在持久化实体时使用注释将这些字段从字段映射中排除。这对 DAO 或实体中的 ID 进行硬编码并不好,因为这些值可能由某些生成器生成,但如果您使用此常量手动更新数据库,您至少可以在代码中将这些 ID 定义为常量,并按 ID 从会话中加载对象在初始化瞬态或持久实例之前。

于 2013-10-26T19:22:03.567 回答
13

而不是这样做:public static final TitleType MR = new TitleType(1, "Mr");

您应该使用 EntityManager 来获取该对象。否则 Hibernate 会注意到,这个对象(id 为 1)已经被存储了,但是由于你没有加载它,实体管理器没有在它自己的集合中拥有它 -> 这是一个分离的实体。

所以,你应该这样做:

TitleType MR = em.find(TitleType.class, 1);
Person p = new Person(...);
p.setTitleType(MR);

em.merge(p);
于 2013-10-26T19:30:06.500 回答