Ошибка вставки при отображении @OneToMany Hibernate с наследованием - PullRequest
1 голос
/ 09 мая 2011

Я использую Java и Hibernate 3.6.4.Final.TABLE_B - это таблица отображения для конкретного типа объектов A (B), которые имеют отношение OneToMany с X объектами.У меня проблемы с вставкой B-сущности в БД.Считывание сущностей B из БД не является проблемой, и связанные с ними сущности X также корректно загружаются.

Модель БД:

  • TABLE_A (id, active, info)
  • TABLE_B (a_id, x_id)
  • TABLE_X (id, info)

Сущность "A" может иметь ноль или более отношений с X-сущностями.Сущность «A», имеющая одно или несколько отношений с X, называется сущностью «B» и имеет свое поведение в коде.

(Имена классов и таблиц изменены для простоты)

@Entity
@Table(name = "TABLE_A")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class A {
  ...
}

@Entity
@Table(name="TABLE_B")
@PrimaryKeyJoinColumn(name="A_ID", referencedColumnName = "ID")
public class B extends A implements Serializable {

    @OneToMany(cascade={CascadeType.ALL})
    @JoinTable(
        name="TABLE_B",
        joinColumns = @JoinColumn( name="A_ID"),
        inverseJoinColumns = @JoinColumn( name="X_ID", insertable = true, nullable = false)
    )
    private List<X> Xs;
    ...
}

Журнал:

SQLStatementLogger - insert into TABLE_A (active, info) values (?, ?)
SQLStatementLogger - insert into TABLE_B (A_ID) values (?)
JDBCExceptionReporter - could not insert: [com.test.B] [insert into TABLE_B (A_ID) values (?)]
java.sql.SQLException: Field 'X_ID' doesn't have a default value

Я бы понял, если проблема вызвана указанием таблицы сущностей как "TABLE_B" и использованием ее для таблицы соединений OneToMany, но именно так выглядит моя модель БД.Мне кажется, что Hibernate сначала пытается просто вставить наследование, и если это сработает, следующая вставка будет отображением между B и X. Проблема в том, что для меня таблица наследования и отображения одинакова.

Как мне правильно отобразить мою модель БД в Hibernate?Помощь очень ценится.

1 Ответ

0 голосов
/ 09 мая 2011

Вы не можете иметь TABLE_B как таблицу «сущностей» (например, таблицу, в которую отображается B), так и таблицу «соединений» (например, таблицу, в которой содержатся соединения между B и X).

В первом случае TABLE_B должен иметь не более одной записи для каждой TABLE_A записи (то есть для тех A s, которые также B s); во втором случае TABLE_B должно иметь столько записей, сколько у вас есть X элементов в коллекции B, что представляет очевидное противоречие.

Таким образом, вы можете сделать следующее:

  • Составьте карту вашей коллекции Xs без таблицы соединений (@ManyToOne на стороне X; @OneToMany mappedBy="X" на стороне B). Ваш X_TABLE должен иметь a_id (или b_id, как бы вы это ни называли) FK для владельца.
  • Использовать другую таблицу (TABLE_B_X для отображения B -to- X)
...