2013-12-13 2 views
4

Мне нужна помощь с привязкой к привязке к JPA. Я думаю, что есть что-то, что я не определил правильно.Неправильное отношение привязки JPA

У меня есть компонент сущности JPA с именем ItemEntity. Существует два типа предметов. Родительские предметы и детские предметы. Родительский элемент может иметь много дочерних элементов, а дочерний элемент имеет только один родительский элемент. Так что на самом деле это многосвязанные отношения ManyToOne/OneToMany JPA.

В моей базе данных таблицы пункт выглядит следующим образом ...

item_no,parent_item_no,item_description 
111,null,This is my parent item 
222,111,This is my child item 

Так что в моей Java программы, когда я называю itemEntity.getChildren по пункту 111, я бы ожидать, чтобы увидеть 222 Однако я получаю пустой.

Вот как я определил мои JPA отношения ...

@Entity(name = "stg_item") 
public class ItemEntity implements java.io.Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "itemid") 
@TableGenerator(name = "itemid", table = "stg_items_sequence", allocationSize = 1) 
private Long id; 

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
@JoinColumn(name = "item_no", referencedColumnName = "parent_item_no") 
private ItemEntity parent; 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "parent") 
private Collection<ItemEntity> children; 

Может кто-нибудь сказать мне, что я делаю неправильно здесь?

Элемент объекта имеет отношения @ManyToOne с другим одним из моих объектов с именем stg_import_payload. Вот именованный запрос, который я использую. Может быть, мне нужно сделать что-то особенное с именованным запросом?

"SELECT x " 
    + " FROM stg_import_payload x " 
    + " WHERE x.processedInd='N' " 
    + " AND EXISTS (SELECT stg_item FROM stg_item stg_item WHERE stg_item.importPayload = x AND stg_item.processedInd='N') "; 

Спасибо.

ответ

6

Docs:

Строка javax.persistence.JoinColumn.referencedColumnName()

(Необязательно) Имя столбца, на которое ссылается столбца внешнего ключа.

При использовании с сопоставлениями отношений сущностей, отличными от описанных здесь случаев, столбец с ссылкой находится в таблице целевого объекта. При использовании с однонаправленным отображением внешнего ключа OneToMany ссылочный столбец находится в таблице исходного объекта. При использовании внутри аннотации JoinTable ссылочный столбец ключей находится в таблице сущности объекта-владельца или обратном объекте, если соединение является частью определения обратного соединения. При использовании в сопоставлении CollectionTable ссылочный столбец находится в таблице объекта, содержащего коллекцию. По умолчанию (применяется только в том случае, если используется столбец с одним соединением): то же имя, что и столбец первичного ключа в ссылочной таблице.

Вы должны изменить это:

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
@JoinColumn(name = "item_no", referencedColumnName = "parent_item_no") 
private ItemEntity parent; 

в

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
private ItemEntity parent; 

Это работает для меня

Смежные вопросы