对象引用了一个未保存的瞬态实例 - 在刷新Hibernate之前保存瞬态实例。

4
我正在使用Seam框架。我有两个实体:
Request.java
@Entity
@Table(name = "SRV_REQUEST")
public class Request {

private Long id;

@Id 
@Column(name = "ID_")
public Long getId() {
   return id;
}

以及 RequestEvent.java

@Entity
@Table(name = "SRV_REQUEST_EVENT")
public class RequestEvent {

private Long id;
private Request request;

@Id
@GeneratedValue
@Column(name = "ID_")
public Long getId() {
   return id;
}

@ManyToOne
public Request getRequest() {
   return request;
}

当我执行这个交易时:
Request request = new Request();
// I have to set ID manually
request.setId(12345);

entityManager.persist(request);

RequestEvent event = new RequestEvent();
event.setRequest(request);

entityManager.persist(event);

我遇到了这个错误:
object references an unsaved transient instance - save the transient instance before flushing: kz.gov.mci.ipsc.services.RequestEvent.request -> kz.gov.mci.ipsc.services.Request

我猜在entityManager.persist(request)之后添加entityManager.flush()不是一个选项。 - Eazy
2个回答

1

试一下这个

    Request request = new Request();
    // I have to set ID manually
    request.setId(12345);

    entityManager.persist(request);

    entityManager.flush();//this point is important

    RequestEvent event = new RequestEvent();
    event.setRequest(request);

    entityManager.persist(event);

0
尝试在getRequest方法上添加{CascadeType.PERSIST,CascadeType.MERGE}。

添加后,我得到了这个错误:ERROR: 重复键值违反了唯一约束条件"srv_request_pkey" 详细信息:Key (id_)=(2000703891)已经存在。然而,在数据库中并没有该请求条目。 - Eazy
我猜如果你想手动设置Id,你需要先刷新(在分配之前保存实体)。 - Lang
使用 entityManager.flush()。 - Lang
添加 {CascadeType.PERSIST, CascadeType.MERGE} 并删除第一个 persist。 - Lang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接