带有@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?

将 @EmbeddedId 与 JpaRepository 一起使用

将 @EmbeddedId 表示为 H2 数据库的 SQL