带有@EmbeddedId和@Embeddable

时间:2015-06-05 13:03:23

标签: jpa eclipselink

需要你的帮助。

我有表请求,它与请求备注表有一对多的关系。

所以我们有请求表,一个名为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);

我现在遇到的问题或错误是。

  1. 创建 - 使用序列正确插入注释 - 成功 - 使用Id 600
  2. 现在它正在尝试运行 - INSERT INTO REQUEST_NOTE,因为我已经有请求ID,所以没有问题但是在这种情况下新生成的Note id - 600没有被分配给REQUEST_NOTE表。
  3. 我想这是常见问题,但我无法弄清楚我做错了什么。

    如何让我的连接表Request Note表知道,它必须使用Note表中新创建的id到其连接表。

1 个答案:

答案 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