请求表是这样注释的。
@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);
我现在的问题或错误是。
我如何让我的连接表请求Note表知道,它必须使用新创建的id从Note表到它的连接表。
如果您使用的是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
问题内容: 我需要了解超级密钥和复合密钥之间的区别。我发现的例子更加令人困惑。您能简单说明一下有什么区别吗?谢谢 问题答案: 超级键唯一地标识一行。它可以由一列或多列组成。复合键是由多个列组成的键。 如果超级键由多列组成,则它也是一个复合键。 如果复合键唯一地标识一行,则它也是超级键。 我看不到“超级密钥”这个名称使用过多:通常只称其为“唯一密钥”。