当前位置: 首页 > 知识库问答 >
问题:

带有@EmbeddedID和@Embeddable的EclipseLink复合密钥

谢俊悟
2023-03-14

请求表是这样注释的。

@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;
  }

现在我有了笔记表,它是普通表。它有自己的@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时,我有以下代码。在这里,我已经有了请求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);

我现在的问题或错误是。

    null

我如何让我的连接表请求Note表知道,它必须使用新创建的id从Note表到它的连接表。

共有1个答案

金嘉言
2023-03-14

如果您使用的是JPA2.0,您可以使用derrived 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

 类似资料:
  • 问题内容: 我有一个具有以下结构的MySQL数据库(节选): 另外,还有一个USER表,但这并不重要,有了这些表,您可以了解问题的全貌。 如您所见,某些列具有将在类中变为的属性。 并且由于它们与其他表的关系而具有复合主键,因此我无法更改。由于为Composite ,因此映射的类必须具有一个带有相应类的。 问题是我需要在组合的 “本机” 部分中添加一个,例如:必须具有JPA @GeneratedVa

  • 我在Spring Boot JPA应用程序中有以下设置: 可嵌入 原因:org.hibernate.AnnotationException:mappedBy引用了未知的目标实体属性:com.foobar.entity.logSearchHistoryAttr.logSearchHistoryAttrs中的com.foobar.entity.logSearchHistoryAttr.logSearc

  • 问题内容: 我创建了一个使用@Id指向@Embeddable复合键的实体。我认为一切正常。但是,据我所知,在将@Id切换为@EmbeddedId之后,一切仍然可以正常工作。 之前: 后: 引用复合键时,使用@Id和@EmbeddedId批注之间有区别吗? 问题答案: 实际上,我对 “之前” 版本的工作感到惊讶。根据规范,映射您的复合键的正确方法是 “之后” 版本。引用JPA 1.0规范: 2.1.

  • 我有一个使用eclipse Indigo3.7.2制作的RCP应用程序,我想使用Eclipselink与Derby数据库通信。但我不能让它工作。我的问题是eclipselink,我尝试了包括jar和bundles,通过包括jar,我得到了 noClassDefoundError:javax/persistence/persistence

  • 问题内容: 我有班钱是@Embeddable 当我在实体中多次使用它时,一切正常。例如 上面的代码完美地工作。 现在,当我有另一个@Embeddable想要在其中包含Money实例并且该@Embeddable被实体多次使用时,就会出现问题。例: 可嵌入 public class ReportCostValues implements Serializable { 实体 public class R

  • 问题内容: 我需要了解超级密钥和复合密钥之间的区别。我发现的例子更加令人困惑。您能简单说明一下有什么区别吗?谢谢 问题答案: 超级键唯一地标识一行。它可以由一列或多列组成。复合键是由多个列组成的键。 如果超级键由多列组成,则它也是一个复合键。 如果复合键唯一地标识一行,则它也是超级键。 我看不到“超级密钥”这个名称使用过多:通常只称其为“唯一密钥”。