带有@EmbeddedId 和@Embeddable 的EclipseLink 组合键
Posted
技术标签:
【中文标题】带有@EmbeddedId 和@Embeddable 的EclipseLink 组合键【英文标题】:EclipseLink composite key with @EmbeddedId and @Embeddable 【发布时间】:2015-06-05 13:03:23 【问题描述】:需要你们的帮助。
我有表格请求,它与请求注释表格有一对多的关系。
所以我们有 request 表,一个名为 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;
接下来我有一个包含请求 id 和注释 id 表的连接表
@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 添加新注释时,我有以下代码。在这里,我已经有请求 ID,但必须生成 Notes id 并将其保存到联接表 (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);
我现在遇到的问题或错误是。
-
它创建 - INSERT INTO NOTE 正确序列 - 成功 - Id 600
现在它正在尝试运行 - INSERT INTO REQUEST_NOTE,因为我已经有了请求 ID,所以没有问题,但是新生成的 Note id - 在这种情况下为 600 没有分配给 REQUEST_NOTE 表。
我想这是常见问题,但我无法弄清楚我做错了什么。
如何让我的联接表 Request Note 表知道,它必须使用从 Note 表新创建的 id 到它的联接表。
【问题讨论】:
【参考方案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;
如果没有,那么您必须手动将注释中的 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
【讨论】:
以上是关于带有@EmbeddedId 和@Embeddable 的EclipseLink 组合键的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的带有@EmbeddedId 的实体不能在其对应的@Embeddable 类中使用LocalDateTime?
休眠:@EmbeddedId、继承和@SecondaryTable
使用 @EmbeddedId 映射时出现 Eclipse 错误
如何使用 @EmbeddedId 使用 Spring Data REST 和 ConversionService?