Hibernate - Использование @SecondaryTable, @OneToMany - PullRequest
2 голосов
/ 22 августа 2011

(упрощенный пример ниже)

Я пытаюсь сопоставить один класс POJO с двумя таблицами БД, а также создаю ассоциацию OneToMany. Вот как выглядит класс ..

@Entity
@Table(name = "external_data")
@SecondaryTable(name = "external_data_hierarchy")
public class ExternalData  {

  private int externalDataId;

  @OneToMany(fetch = FetchType.LAZY)
  @JoinTable(name = "external_data_hierarchy")
  @JoinColumn(name = "external_data_parent_id")
  private List<ExternalData> children;
..

}

Вот таблицы ..

mysql> desc external_data;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| external_data_id | int(11)      | NO   | PRI | NULL    | auto_increment |
+------------------+--------------+------+-----+---------+----------------+
5 rows in set (0.06 sec)

mysql> desc external_data_hierarchy;
+----------------------------+---------+------+-----+---------+----------------+
| Field                      | Type    | Null | Key | Default | Extra          |
+----------------------------+---------+------+-----+---------+----------------+
| external_data_hierarchy_id | int(11) | NO   | PRI | NULL    | auto_increment |
| external_data_parent_id    | int(11) | YES  | MUL | NULL    |                |
| external_data_child_id     | int(11) | YES  | MUL | NULL    |                |
+----------------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Note: "external_data_parent_id" and "external_data_child_id" columns refer external_data.external_data_id column.

Как вы можете сказать, я пытаюсь сохранить отношения родитель-ребенок в другой таблице. Теперь, когда я пытаюсь создать () на ExternalData без установки дочерних элементов, это работает. Когда я пытаюсь извлечь эти созданные данные с помощью ExternalData.getChildren (), я получаю следующее исключение ..

[main] WARN  in [org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:100)] - SQL Error: 1054, SQLState: 42S22
[main] ERROR in [org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:101)] - Unknown column 'externalda0_1_.external_data_id' in 'on clause'

Что я делаю не так?

1 Ответ

2 голосов
/ 22 августа 2011

Не ясно, какое отношение существует между таблицами.Какая польза от колонки external_data_child_id?

Что я могу сказать, это то, что:

  • У вас нет @OneToMany аннотации для дочернего поля
  • Это OneToMany отображается либо благодаря столбцу соединения, либо благодаря таблице соединения.Не оба.
  • Поскольку вы используете вторичную таблицу, вы должны указать, в какой таблице находится каждый столбец или JoinColumn, используя атрибут таблицы аннотации (или, по крайней мере, вы должны указать его, когда столбецили объединение столбцов отсутствует в первичной таблице).

См. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-join для объяснения того, как следует использовать SecondaryTable, и http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-mapping для объяснения ассоциаций OneToMany.

...