Java Hibernate CascadeType.SAVE\u更新时发生更新TransClient异常
我使用SpringBoot和H2内存中的数据库Java Hibernate CascadeType.SAVE\u更新时发生更新TransClient异常,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我使用SpringBoot和H2内存中的数据库 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 和Hibernate核心{5.0.12.Final} 我有一个对象实体 @Entity @Table(name = "T_OBJECT") public class ObjectEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
和Hibernate核心{5.0.12.Final}
我有一个对象实体
@Entity
@Table(name = "T_OBJECT")
public class ObjectEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "IDT_OBJECT")
private Long id;
@Column(name = "NAME",length = 50, nullable = false)
private String name;
// from org.hibernate.annotations.CascadeType;
@Cascade(CascadeType.SAVE_UPDATE)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CATEGORY_OBJECT", referencedColumnName = "IDT_CATEGORY")
private CategoryEntity category;
}
和一个分类实体
@Entity
@Table(name = "T_CATEGORY")
public class CategoryEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "IDT_CATEGORY")
private Long id;
@Column(name = "NAME")
private String name;
}
我有这项服务
@Transactional(rollbackOn = Exception.class)
public void saveOrUpdateObject(ObjectForm object) {
ObjectEntity objEntity = null;
if(object.getId() != null) {
objEntity = daoObject.findById(object.getId())
}
if(objEntity == null) {
objEntity = new ObjectEntity();
// we can't change the name
objEntity.setName(object.getName);
}
CategoryEntity catEntity = objEntity.getCategory();
if(catEntity == null) {
catEntity = new CategoryEntity();
}
catEntity.setName(object.getCategoryName())
objEntity.setCategory(catEntity);
// execute sessionFactory.getCurrentSession().saveOrUpdate()
daoObject.saveOrUpdate(objEntity);
}
当我创建对象时,这段代码可以很好地工作,但是当使用不同的类别进行更新时,会出现transcent错误
Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.appli.entity.ObjectEntity.category -> com.appli.entity.CategoryEntity
当然,如果我使用daocegory.saveOrUpdate(catEntity)
将CategoryEntity保存到我的服务中,然后再保存ObjectEntity
,它可以工作,但级联保存更新不需要这样做
但是如果我更改了CascadeType.SAVE\u persistence.Cascade更新
@ManyToOne(fetch = FetchType.LAZY,cascade = {javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.REFRESH, javax.persistence.CascadeType.MERGE})
@JoinColumn(name = "CATEGORY_OBJECT", referencedColumnName = "IDT_CATEGORY")
private CategoryEntity category;
它可以在不更改服务行的情况下进行创建和更新@Cascade(CascadeType.ALL)
也可以工作
我认为
@Cascade(hibernate.annotations.CascadeType.SAVE_UPDATE)
与Cascade={javax.persistence.CascadeType.PERSIST,javax.persistence.CascadeType.REFRESH,javax.persistence.CascadeType.MERGE}相同,根据经验,您应该始终对瞬态实体使用persistence,对分离的实体使用MERGE。saveOrUpdate的缺点(将分离的实体快照传递给已经管理该实体的会话时)导致了合并操作,请检查此链接:我认为这并不能解释为什么hibernate SAVE_UPDATE会导致Transcenter异常,而是替换了javax.persistence{persist,refresh,merge)工作得很好。我有其他hibernate项目,而且从来没有在SAVE_UPDATE上遇到过问题。我真的不明白为什么在这个spring启动项目中,在一个非常基本的关联上,我会遇到这个问题:/但是链接的thx。对我来说,这是hibernate 5.0.12的问题