Hibernate: отношения между ребенком и родителями - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть две таблицы:

НАИМЕНОВАНИЕ СТОЛОВ: TABLE_A

A_ID
A_CODE
A_DESC

НАИМЕНОВАНИЕ СТОЛОВ: TABLE_B

B_ID
B_TABLE_A_PARENT_ID
B_TABLE_A_CHILD_ID

Где: A_ID TABLE_A можно ввести в B_TABLE_A_PARENT_ID и B_TABLE_A_CHILD_ID в TABLE_B, чтобы создать отношение к себе.

Мой код:

@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.TableB.tableA в com.parentchild.TableA.tableB

Я думаю, что нарушающий код является первым блоком кода выше в Таблице A, но я не знаю, что делать. Пожалуйста, помогите мне.

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Причина этого сообщения об ошибке заключается в том, что нет постоянного свойства с именем "tableA".Значение mappedBy должно быть постоянным свойством.Так что измените его на то, что должно быть обратной стороной.Может быть, вы хотите, чтобы это было «parentId» или «childId», я не знаю, не может быть и то и другое.

Тогда у вас все еще будут, например, следующие проблемы:

  • Нет@Id для TableA
  • public TableB_id: прописной I
  • открытый класс TableB_Id не реализует Serializable (он должен использоваться, поскольку используется как идентификатор).
  • "public void setTableBSet(Установите tableBSet) {"Может быть, тип элемента должен быть TableB
  • нет идентификатора для TableA
  • В TableB" return this.parentTable "у вас нет такой переменной
  • вы используете доступ на основе свойств без сеттеров
0 голосов
/ 30 сентября 2011

Недавно я сопоставил @Many-To-Many с составным первичным ключом: вы можете легко изменить его на @One-To-Many.

вот полный код и пояснения:

Отображение ManyToMany с составным первичным ключом и аннотацией:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...