需要你的帮助。
我有表请求,它与请求备注表有一对多的关系。
所以我们有请求表,一个名为request_note表和notes表的连接表。
请求表注释如下。
@Entity
@Table( name = "REQUEST" )
public class Request implements Serializable {
/**
Different other columns and below is request note table
**/
@OneToMany( cascade = CascadeType.ALL, mappedBy = "request" )
private List<RequestNote> requestNoteList;
}
接下来,我的连接表包含Request id和note id table
@Entity
@Table( name = "REQUEST_NOTE" )
public class RequestNote implements Serializable {
@EmbeddedId
protected RequestNotePK requestNotePK;
@ManyToOne( optional = false, fetch = FetchType.LAZY )
private Request request;
@JoinColumn( name = "NOTE", referencedColumnName = "ID", insertable = false, updatable = false )
@ManyToOne( optional = false, fetch = FetchType.EAGER )
private Note note;
}
现在我有自己的Notes表,这是常规表。它有自己的@SequenceGenerator
@Entity
@Table( name = "NOTE" )
public class Note implements Serializable {
@Id
@NotNull
@GeneratedValue( generator = "NOTE_SEQ" )
@SequenceGenerator( name = "NOTE_SEQ", sequenceName = "NOTE_SEQ", allocationSize = 1 )
private String id;
@OneToMany( cascade = CascadeType.ALL, mappedBy = "note" )
private List<RequestNote> requestNoteList;
}
现在,通过用户界面,用户可以更改,添加或删除请求的备注。
当我从UI添加新Note时,我有以下代码。这里我已经有了Request Id但是必须生成Notes id并将其保存到Join table(request_note)表中,我收到错误。
//Create New Note
Note newNote = new Note();
newNote = noteFromUI;
//something like that very common
//Creating new Request Note row
RequestNote newRequestNote = new RequestNote();
newRequestNote.setNote(noteFromUI);
newRequestNote.setRequest(getRequest());
RequestNotePK requestNotePK =
new RequestNotePK(getRequest().getId(), noteFromUI.getId());
newRequestNote.setRequestNotePK(requestNotePK);
getRequest().addRequestNoteList(newRequestNote);
我现在遇到的问题或错误是。
我想这是常见问题,但我无法弄清楚我做错了什么。
如何让我的连接表Request Note表知道,它必须使用Note表中新创建的id到其连接表。
答案 0 :(得分:1)
如果您使用的是JPA 2.0,您可以使用原始ID,特别是@MapsId,如下所示:
@MapsId("id")//attribute name from within RequestNotePK
@JoinColumn( name = "NOTE", referencedColumnName = "ID")
@ManyToOne( optional = false, fetch = FetchType.EAGER )
private Note note;
如果没有,则必须手动将note中的id设置为RequestNotePK实例。您的代码中缺少的是,只有在调用flush时才能保证设置ID:
Note newNote = new Note();
newNote = noteFromUI;
em.persist(newNote);//ID would be set if the sequence allows a pre allocation
em.flush();//issues statements and will set sequence values
在此之后,note.id将被设置并可用于设置RequestNote.RequestNotePK.id