2013-01-14 62 views
4

我正在使用Seam Framework。我有2个实体:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例休眠

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 
+0

我估计后entityManager.persist(请求)将entityManager.flush()是不是一个选项 – Eldar

回答

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

我已经尝试过,但我想这是不正确的选择。 – Eldar

0

尝试添加{CascadeType.PERSIST,CascadeType.MERGE}上调用getRequest方法

+0

添加后,我得到这个错误:错误:重复键值违反唯一约束“srv_request_pkey” 详细信息:键(id _)=(2000703891)已经存在。但是在数据库中没有这样的请求条目。 – Eldar

+0

我想如果你想手动设置ID你需要刷新(保存你的实体之前,分配它) – Lang

+0

使用entityManager.flush()。 – Lang

相关问题