ORM: сопоставление OneToOne для столбца без первичного ключа - книга и инвентарь, сопоставленные ISBN - PullRequest
7 голосов
/ 22 марта 2009

У меня есть модель Book и модель Inventory, сопоставленные с номером ISBN, но ISBN также не является первичным ключом. Книги принадлежат книжным магазинам, а инвентарь предназначен для группы книжных магазинов (BookstoreChain). Инвентарь распределяется между всеми книжными магазинами, принадлежащими книжной сети.

Я использую отображение Hibernate @OneToOne на стороне книги, чтобы получить информацию об инвентаризации путем присоединения к столбцу ISBN. Так или иначе, Hibernate правильно генерирует левый запрос на внешнее объединение, но инвентарь для объекта Book равен нулю. Его не ленивый загружен либо. Игнорируя Книжный магазин и Цепочку, как мне сделать объединение OneToOne или ManyToOne и получить инвентарь, когда Книги выбраны?

class Book{
@Id
Long id

@Column
String isbn;

@Column
String title;

@OneToOne(optional = true)
@JoinColumn(name = "isbn", referencedColumnName = "isbn",insertable = false, updatable = false)
Inventory inventory;
}

class Inventory{
@Id
Long id

@Column
String chainId

@Column
String isbn

@Column
Long availableQty
}

Ответы [ 4 ]

3 голосов
/ 15 июня 2009

Вы должны назвать свою ссылку на соединение как-нибудь еще. isbn - это уже столбец. Попробуйте это:

@OneToOne(optional = true)
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false)
Inventory inventory;
1 голос
/ 24 марта 2009

Я сомневаюсь, что это как-то связано с этой проблемой, но я подумал, что я все равно подниму ее, чтобы убедиться, что это не недосмотр, который был упущен:

Обратите внимание, что при использовании referencedColumnName для неосновного ключевой столбец, связанный класс имеет быть сериализуемым.

Ссылка: [http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]

Я знаю, вы сказали, что генерируется LEFT OUTER JOIN, но я подумал, что выборка по умолчанию была LAZY, если она не была указана. Возможно, явное указание режима выборки может дать разные результаты.

И наконец, если вы используете HQL-запрос, возможно, публикация этого с любыми другими классами сущностей поможет сообществу решить проблему.

1 голос
/ 09 июня 2009

Ваша схема базы данных не имеет смысла, основываясь на том, что вы здесь показали. Соотношение между книгой и инвентарем должно быть один ко многим - по-видимому, одна и та же книга находится в нескольких инвентаре, что означает, что вы не можете связать книги и инвентаризации только с ISBN. Поскольку isbn не является уникальным для всех инвентаризаций, у вас будет несколько строк в инвентаре с одинаковым isbn, но разными chainIds - какая строка является правильной строкой для данной книги / isbn? У книги должен быть внешний ключ к инвентаризации, а не инвентарь.

0 голосов
/ 22 марта 2009

просто предположение: name = 'ISBN' должен совпадать с полем в Inventory?

...