我试图在两个实体之间创建一个双向一对多关联,其中多边有一个复合关键字。而许多方面的关键之一就是来自一方。另外,我需要协会的拥有者多方。以下是显示我的代码外观的示例代码。休眠双向一对多复合密钥
没有Jointable
父类是一侧。我需要这个协会的这边老板。
public class parent{
@Id
@Column(name = "NAME")
private String name;
@OneToMany(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="NAME", nullable = false),
@JoinColumn(name="PARENT", nullable = false)})
private Set<Child> childs;
}
子类是多方面。它的主键是“名字”和“父母”。 “父母”来自协会。
public class child{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="parent", [email protected](name="PARENT", nullable=false)),
@AttributeOverride(name="name", [email protected](name="NAME", nullable=false))})
private ChildId id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="PARENT", nullable = false, updatable = false, insertable = false),
@JoinColumn(name="NAME", nullable = false, updatable = false, insertable = false)})
private Parent parent;
}
ChildId是Embedded id。
@Embeddable
public class childId{
@Column(name = "PARENT")
private String parent;
@Column(name = "NAME")
private String name;
}
随着Jointable
父类
public class parent{
@Id
@Column(name = "NAME")
private String name;
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name="PARENTCHILD",
joinColumns= {@JoinColumn(name="PNAME", referencedColumnName = "NAME", nullable = false)},
inverseJoinColumns = {
@JoinColumn(name="CNAME", referencedColumnName = "NAME", nullable = false),
@JoinColumn(name="CPNAME", referencedColumnName = "PARENT", nullable = false)})
private Set<Child> childs;
}
子类
public class child{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="parent", [email protected](name="PARENT", nullable=false)),
@AttributeOverride(name="name", [email protected](name="NAME", nullable=false))})
private ChildId id;
@MapsId("parent")
@ManyToOne(fetch=FetchType.LAZY)
@JoinTable(name="PARENTCHILD",
inverseJoinColumns = {@JoinColumn(name="PNAME", referencedColumnName = "NAME", nullable = false)},
joinColumns = {
@JoinColumn(name="CNAME", referencedColumnName = "NAME", nullable = false),
@JoinColumn(name="CPNAME", referencedColumnName = "PARENT", nullable = false)})
private Parent parent;
}
问题1: 此代码不能正常工作。如果“没有连接”,它会给出以下例外。
Caused by: org.hibernate.AnnotationException: A Foreign key refering com.entity.Parent from com.entity.Child has the wrong number of column. should be 1
问题2: 而在“与jointable”的情况下,它提供例外如下:
SQLCODE=-530, SQLSTATE=-23503, SQLERRMC=PARENTCHILD.FK_PARENTCHILD_CHILD
你不需要有这个问题的复合键,作为父母的名字将被Hibernate itself.To插入的外键儿童让Parent作为关系的所有者,请在child @ManyToOne中添加mappedBy = parent。这应该可以解决你所有的问题。 请验证并接受我用下面的代码片段给出的答案。 –
我给你的答案中的代码,你不需要加入,只是尝试我给的代码。请参阅下面的答案,尝试该代码,让我知道你面对什么问题。 –
谢谢@BirajChoudhury。我知道这很多,父母将作为外键在子表中。但是,假设孩子的独特性与父母的名字一致。然后,假设孩子的主键为EmbeddedId,你的代码将和我的一样。 – amir