Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate CascadeType.SAVE\u更新时发生更新TransClient异常_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java Hibernate CascadeType.SAVE\u更新时发生更新TransClient异常

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)

我使用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)
    @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的问题