【问题标题】:Hibernate: Parent-Child Relationship to ItselfHibernate:与自身的亲子关系
【发布时间】:2011-09-30 07:16:43
【问题描述】:

我有两张桌子:

表名:TABLE_A

A_ID
A_CODE
A_DESC

表名:TABLE_B

B_ID
B_TABLE_A_PARENT_ID
B_TABLE_A_CHILD_ID

在哪里: 可以在 TABLE_B 的 B_TABLE_A_PARENT_ID 和 B_TABLE_A_CHILD_ID 中输入 TABLE_A 的 A_ID 以创建与自身的关系。

我的代码:

@Entity
@Table(name = "TABLE_A")
public class TableA{
private int id;
private String code;
private String desc;

private Set<TableB> tableBSet= new HashSet<TableB>(0);

@OneToMany(fetch = FetchType.LAZY, mappedBy = "tableA", cascade = CascadeType.ALL)
public Set<TableB> getTableBSet() {
return tableBSet;
}

public void setTableBSet(Set<TableBSet> tableBSet) {
this.tableBSet = tableBSet;
}
}

在另一个班级:

@Entity
@Table(name = "TABLE_B")
public class TableB{
private TableB_Id id;
private TableA parentA;
private TableA childA;

@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "parentTableId", column = @Column(name = "B_TABLE_A_PARENT_ID", nullable = false, precision = 22, scale = 0)),
@AttributeOverride(name = "childTableId", column = @Column(name = "B_TABLE_A_CHILD_ID", nullable = false, precision = 22, scale = 0)) })
public TableB_id getId() {
return this.id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "B_TABLE_A_PARENT_ID", nullable = false, insertable = false, updatable = false)
public TableA getParentA() {
return this.parentTable;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "B_TABLE_A_CHILD_ID", nullable = false, insertable = false, updatable = false)
public TableA getChildA() {
return this.childA;
}
}

关于ID类:

@Embeddable
public class TableB_Id {
private int parentTableId;
private int childTableId;

@Column(name = "B_TABLE_A_PARENT_ID", nullable = false, precision = 22, scale = 0)
public Integer getParentTableId() {
return this.parentTableId;
}

@Column(name = "B_TABLE_A_CHILD_ID", nullable = false, precision = 22, scale = 0)
public Integer getChildTableId() {
return this.childTableId;
}
}

当我运行服务器时,我收到以下错误:

原因:org.hibernate.AnnotationException: mappedBy 引用了一个未知的目标实体属性:com.parentchild.TableA.tableB 中的 com.parentchild.TableB.tableA

我认为有问题的代码是上面 TableA 中的第一块代码,但我不知道该怎么做。请帮助我。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "tableA", cascade = CascadeType.ALL)
public Set<TableB> getTableBSet() {
return tableBSet;
}

提前谢谢你!

【问题讨论】:

标签: hibernate jpa annotations relationship


【解决方案1】:

最近,我用复合主键映射@Many-To-Many:您可以轻松地将其更改为@One-To-Many

这里是完整的代码和解释:

Mapping ManyToMany with composite Primary key and Annotation:

【讨论】:

    【解决方案2】:

    该错误消息的原因是没有名为“tableA”的持久属性。 mappedBy 的值应该是持久属性。因此,将其更改为应该是反面的任何内容。也许你希望它是“parentId”或“childId”,我不知道,不能两者兼而有之。

    那么你仍然会遇到以下问题:

    • 表A没有@Id
    • public TableB_id : 大写 I
    • 公共类 TableB_Id 没有实现 Serializable(应该是因为它被用作 id)。
    • "public void setTableBSet(Set tableBSet) {"也许元素类型应该是TableB
    • TableA 没有 id
    • 在TableB“return this.parentTable”中你没有这样的变量
    • 您使用基于属性的访问而无需设置器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      相关资源
      最近更新 更多