2010-03-17 2 views
0

Мы пытаемся использовать основные отношения @OneToMany:JPA конкатенации имена таблиц для родителей/ребенка @OneToMany

@Entity 
@Table(name = "PARENT_MESSAGE") 
public class ParentMessage { 

@Id 
@Column(name = "PARENT_ID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer parentId; 

@OneToMany(mappedBy="parentMsg",fetch=FetchType.LAZY) 
private List childMessages; 

public List getChildMessages() { 
    return this.childMessages; 
} 
... 
} 

@Entity 
@Table(name = "CHILD_MSG_USER_MAP") 
public class ChildMessage { 

@Id 
@Column(name = "CHILD_ID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer childId; 

@ManyToOne(optional=false,targetEntity=ParentMessage.class,cascade={CascadeType.REFRESH}, fetch=FetchType.LAZY) 
@JoinColumn(name="PARENT_ID") 
private ParentMessage parentMsg; 

public ParentMessage getParentMsg() { 
    return parentMsg; 
} 
... 
}
ChildMessage child = new ChildMessage(); 
    em.getTransaction().begin(); 
    ParentMessage parentMessage = (ParentMessage) em.find(ParentMessage.class, parentId); 
    child.setParentMsg(parentMessage); 
    List list = parentMessage.getChildMessages(); 
    if(list == null) list = new ArrayList<ChildMessage>(); 
    list.add(child); 
    em.getTransaction().commit(); 

Мы получаем следующее сообщение об ошибке. Почему OpenJPA объединяет имена таблиц в APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP? Конечно, эта таблица не существует .. таблица, определенная в APP.PARENT_MESSAGE и APP.CHILD_MSG_USER_MAP

Вызванный: org.apache.openjpa.lib.jdbc.ReportingSQLException: Таблицы/Просмотр 'APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP' не существует. {SELECT, t1.CHILD_ID, t1.PARENT_ID, t1.CREATED_TIME, t1.USER_ID ОТ APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP t0 INNER JOIN APP.CHILD_MSG_USER_MAP t1 ВКЛ t0.CHILDMESSAGES_CHILD_ID = t1.CHILD_ID ГДЕ t0.PARENTMESSAGE_PARENT_ID =? } [код = 30000, состояние = 42X05]

ответ

2

Возможно, вы захотите добавить атрибут mappedBy к стороне владельца отношений. Это говорит JPA, что это только одно отношение, а не два разных отношения. Может быть, с другой стороны.

+0

'@OneToMany (mappedBy =" parentMsg "..." исправлена ​​проблема – Lightbeard

0

Вы должны были бы использовать @JoinColumn и, возможно, @JoinColumns аннотаций, а на ваших отношениях сущностей сказать JPA, как выработать отношения. Обратите внимание, что вам нужно будет указать те поля, которые уже присутствуют в сущности, как insertable=false, updatable=false, так как вы не можете иметь два поля с возможностью записи с тем же именем в сущности.

+0

Я просто попробовал, добавив '@JoinColumn (name =" PARENT_ID ")' под '@ ManyToOne' для класса Child и по-прежнему получал то же исключение. Я обновил свой пост выше. Я подозреваю, что мы все еще неправильно понимаем, как указать внешние ключи. – Lightbeard

+0

Вы также пытаетесь использовать 'referencedColumnName' – Romain

+0

И' mappedBy' в соответствии с ответом Винсента :) – Romain

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

  • Нет связанных вопросов^_^