Sup*_*era 8 java hibernate jpa
我正在尝试使用Hibernate EntityManager persist方法将一个人pojo插入mysql数据库,
entityManagerTransactionService.getEntityManager().persist(TemplateObject);
Run Code Online (Sandbox Code Playgroud)
得到这个例外,
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)....
Run Code Online (Sandbox Code Playgroud)
还有更多......
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)
Run Code Online (Sandbox Code Playgroud)
我的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;
Run Code Online (Sandbox Code Playgroud)
然后是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");
}
Run Code Online (Sandbox Code Playgroud)
我正在将标题类型类设置为该人,
person.setTitleType(TitleType.MR);
Run Code Online (Sandbox Code Playgroud)
将公共静态最终类型定义的类传递给Hibernate是不可能的?或者有什么我做错了吗?
提前致谢
小智 18
您尝试保留的对象包括TitleType不应具有ID值的对象.否则,Hibernate将检查该对象在会话上下文中是持久的还是分离的.如果您不希望持久保存对象的某些字段,则可以使用@Transient注释在持久化实体时从字段映射中排除这些字段.这对DAO或实体中的ID进行硬编码并不好,因为这些值可能是由某些生成器生成的,但如果您使用此常量手动更新数据库,则至少可以将这些ID定义为代码中的常量,并通过ID从session加载对象在初始化瞬态或持久实例之前.
dog*_*ose 13
而不是这样做: public static final TitleType MR = new TitleType(1, "Mr");
您应该使用EntityManager来获取该Object.另外,Hibernate会注意到,这个Object(ID为1)已经存储,但由于你没有加载它,实体管理器没有将它放在自己的集合中 - >那是一个独立的实体.
所以,你应该这样做:
TitleType MR = em.find(TitleType.class, 1);
Person p = new Person(...);
p.setTitleType(MR);
em.merge(p);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68065 次 |
| 最近记录: |