【发布时间】:2015-11-09 23:49:30
【问题描述】:
我正在尝试在多方具有复合键的两个实体之间创建双向一对多关联。多方的关键之一来自一方。另外,我需要多方作为协会的所有者。下面是一个示例代码,展示了我的代码的样子。
无接头
一侧的父类。我需要有这个协会的所有者。
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;
}
Child Class 是多方面的。它的主键是“name”和“parent”。 “父母”来自关联。
public class child{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="parent", column=@Column(name="PARENT", nullable=false)),
@AttributeOverride(name="name", column=@Column(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 是嵌入的 id。
@Embeddable
public class childId{
@Column(name = "PARENT")
private String parent;
@Column(name = "NAME")
private String name;
}
可连接
父类
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", column=@Column(name="PARENT", nullable=false)),
@AttributeOverride(name="name", column=@Column(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: 如果是“可连接”,它会给出以下异常:
SQLCODE=-530, SQLSTATE=-23503, SQLERRMC=PARENTCHILD.FK_PARENTCHILD_CHILD
【问题讨论】:
-
这个问题你不需要复合键,因为父名会被 Hibernate 本身作为外键插入到 Child 中。要使 Parent 成为关系的所有者,请添加 mappedBy = parent在孩子@ManyToOne 中。那应该可以解决你所有的问题。请验证并接受我用下面的代码 sn-ps 给出的答案。
-
我给了你答案中的代码,你不需要加入,只需尝试我提供的代码即可。请参阅下面的答案,尝试该代码,让我知道你面临什么问题。跨度>
-
谢谢@BirajChoudhury。我知道父母将作为外键在子表中。但是,假设孩子的唯一性是用父母的名字来识别的。然后,假设child的主键为EmbeddedId,你的代码将和我的一样。
-
我不明白您的评论,您是否同意我的解决方案?或者我还没有理解你的问题?我在问这个 bcoz 我知道如何解决这个错误 - “来自 com.entity.Child 的外键引用 com.entity.Parent 的列数错误。应该是 1”,我只是不确定你是否需要它.
-
@BirajChoudhury。我想你还没有理解我的问题。简单,我有一个 Child 类,它与“name”(String)属性和“parent”(String)属性的组合统一,它是 Parent 类的主键。请接受这个假设,即 Child 的唯一性是由这两个定义的。然后,一个子对象可以有一个父对象,而一个父对象可以有多个子对象。您可以在 5.1.2.1.1 中找到 EmbeddedId here 的示例
标签: java hibernate jpa hibernate-mapping hibernate-annotations