2013-03-05 3 views
0

У меня есть 1 объект вызова Item, в котором я хочу иметь возможность связывать родительские элементы с дочерними элементами. для использования таблицы join для создания отношений родителя/ребенка. Я не смог получить хорошую документацию. Поэтому, если у кого-то есть мысли, я все уши.JPA Self Join using JoinTable

Вот что я имею ... который работает большую часть времени.

public class Item implements java.io.Serializable { 
    @Id 
    private Long id; 

    @ManyToOne(optional = true, fetch = FetchType.LAZY) 
    @JoinTable(name = "ITEMTOITEM", joinColumns = { @JoinColumn(name = "ITEMID") }, inverseJoinColumns = { @JoinColumn(name = "PARENTITEMID") }) 
    private Item parent; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private List<Item> children; 
} 

Иногда, когда я хочу, чтобы вернуть объекты, которые привязаны к этому пункту таблицы я получаю ошибку следующим образом:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.webflow.engine.ActionExecutionException: Exception thrown executing [[email protected] targetAction = [email protected], attributes = map['method' -> 'handleEntry']] in state 'oneTimeChargesAndFeesView' of flow 'in-flow' -- action execution attributes were 'map['method' -> 'handleEntry']'; nested exception is Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: ORA-00904: "PARENTITEM_ITEMID": invalid identifier 

Error Code: 904 
Call: SELECT ITEMID, ITEMSHORTDESC, EFFENDDATE, ITEMDESC, PARENTITEM_ITEMID, ITEMTYPECODE FROM ITEM WHERE (ITEMID = ?) 
    bind => [1250] 
Query: ReadObjectQuery(com.domain.Item) 

Любая помощь будет оценена.

+0

Здесь я соединили схему таблицы [здесь] (http://dbdsgnr.appspot.com/app#agdkYmRzZ25ycg8LEgZTY2hlbWEY0riZAQw). – jtoepfer

+0

Последнее небольшое предостережение в том, что мне нужно это для работы с eclipselink и toplink-essentials. Поэтому я ограничена использованием сопоставлений JPA 1.0. – jtoepfer

ответ

0

После многого чтения в JPA 2.0 я понял, что мне нужна более новая версия Eclipselink 2.3+, чтобы поддержать то, что я пытался сделать. Вот код, который действительно работал в моем случае, но он не будет работать из-за нашей зависимости от более старой версии [EclipseLink 2.0.2]. Также еще один проект по-прежнему использует Toplink-essentials JPA 1.0, который снова похож на эту нотацию.

public class Item { 

@ManyToOne(optional = true, fetch = FetchType.LAZY) 
@JoinTable(name = "ITEMINCENTIVESMAPPING", 
     joinColumns = { @JoinColumn(name = "INCENTIVEITEMID", referencedColumnName = "ITEMID", insertable = false, updatable = false) }, 
     inverseJoinColumns = { @JoinColumn(name = "ITEMID", referencedColumnName = "ITEMID", insertable = false, updatable = false) }) 
private Item parentItem; 

@OneToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "ITEMINCENTIVESMAPPING", 
     joinColumns = { @JoinColumn(name = "INCENTIVEITEMID", referencedColumnName = "ITEMID") }, 
     inverseJoinColumns = { @JoinColumn(name = "ITEMID", referencedColumnName = "ITEMID") }) 
private List<Item> items; 

} 
+0

Для меня похоже, что вы сопоставили два отдельных отношения: однонаправленное многозначное и однонаправленное одно-ко-многим. Почему бы не сопоставить одноразовое отношение? Это было решение, предложенное для саморегуляции отношений «многие ко многим» (использовалось двунаправленное сопоставление): http://drag0sd0g.blogspot.com/2010/03/many-to-many-self-reference-in- java.html – scottb

+0

Как вы можете настраивать работу CRUD на этом типе модели? например, get by parentItem(). Любая помощь приветствуется. Благодаря!!! – Musa

2

Попробуйте использовать вместо @JoinColumn:

@ManyToOne(optional = true, fetch = FetchType.LAZY) 
@JoinColumn(name = "PARENTITEMID", referencedColumnName = "ITEMID") 
private Item parent; 

@OneToMany(
     cascade = {CascadeType.ALL}, 
     orphanRemoval = true, 
     fetch = FetchType.LAZY 
) 
@JoinColumn(name = "PARENTITEMID") 
private List<Item> children; 
+0

Я ищу, чтобы использовать таблицу Join между родительским и дочерним объектами. Я считаю, что ваше сопоставление допускает только одно отображение самого себя. – jtoepfer

+0

Это сопоставление без дополнительной таблицы. У каждого ребенка есть ссылка на родителя. –

0

Я считаю, что @JoinTable разрешено только на @OneToOne или @OneToMany или @ManyToMany, я не думаю, что это имеет смысл на @ManyToOne. Используйте @JoinColumn или @OneToOne.

Также ваш @OneToMany не имеет смысла, MappedBy должен быть атрибутом, и у вас нет родительского элемента, он должен быть родительским, а родитель должен использовать @JoinColumn.

+0

Джеймс, спасибо за головы, MappedBy был ошибкой CAP. Я исправил его в оригинале. – jtoepfer