关于保存子对象和父对象已保存的TransientObjectException

时间:2018-12-19 09:48:04

标签: java hibernate jpa

我正在尝试使用已创建的Curs外键保存对象Alumne,但是我正在获取org.hibernate.TransientObject.Exception。

一个curs可以有很多校友。

我只想保存Alumne和外键idCurs,Curs已经保存在数据库中,但是我在

中得到了TransientObjectException
@ManyToOne
@JoinColumn(name = "id", referencedColumnName = "idCurs")

我没有添加任何层叠,因为Curs已经保存并且我不想替换其数据。

我想念什么吗?告诉我再次询问curs吗?

错误

...
Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: es.caib.accfor.ejb.aplicacions.alumne.entity.Alumne.curs -> es.caib.accfor.ejb.aplicacions.curs.entity.Curs
...
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: es.caib.accfor.ejb.aplicacions.alumne.entity.Alumne.curs -> es.caib.accfor.ejb.aplicacions.curs.entity.Curs
...

Alumne.java

@Entity
@Table(name="Alumne")
public class Alumne implements Serializable {
    ...
    @Id
    @Column(name = "ALU_ID")
    @SequenceGenerator(name = "AF_ACC_ALUMNE_ID_GENERATOR", sequenceName = "AF_ACC_ALUMNE_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AF_ACC_ALUMNE_ID_GENERATOR")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "ALU_AVALUACIO")
    private GruReg avaluacio;

  @ManyToOne
  @JoinColumn(name = "id", referencedColumnName = "idCurs")
  private Curs curs;
 ...

Curs.java

@Entity
@Table(name = "CURS")
public class Curs implements Serializable {
    ...
    @Id
    @Column(name = "OFF_CODI")
    @SequenceGenerator(name = "AF_ACC_CURSOS_ID_GENERATOR", sequenceName = "AF_ACC_CURSOS_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AF_ACC_CURSOS_ID_GENERATOR")
    private Long id;
    ...

AlumneService.java

@Stateless
@LocalBinding(jndiBinding = Names.ALUMNE_SVC)
public class AlumneService extends BackService<Alumne> implements AlumneServiceInterface {
    public Alumne save(Alumne alumne) throws AppException {
        Alumne nou;

        if (eManager.contains(alumne)) {
            nou = eManager.merge(alumne);
        } else {
            eManager.persist(alumne);
            nou = alumne;
        }

        return nou;
    }

1 个答案:

答案 0 :(得分:0)

没有您的代码很难准确诊断,但我可以肯定这是您的问题。

在一个休眠会话中,您从数据库中加载Curs对象。

在另一个会话中,创建Alumne对象并在其上设置Curs对象。由于Curs对象处于 current 会话中,因此它被认为是瞬时的。

您需要做的是确保Curs对象连接到您要在其中创建Alumne对象的同一会话。因此,在保存Alumne对象的同一会话中,加载Curs对象并将其设置在Alumne对象上

那应该可以解决您的问题。