JPA, объединяющий имена таблиц для родительского / дочернего @OneToMany

StackOverflow https://stackoverflow.com/questions/2465743

  •  20-09-2019
  •  | 
  •  

Вопрос

Мы пытаемся использовать базовое отношение @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' не существует.{ВЫБЕРИТЕ t1.CHILD_ID, t1.PARENT_ID, t1.CREATED_TIME, t1.USER_ID ИЗ ПРИЛОЖЕНИЯ.PARENT_MESSAGE_CHILD_MSG_USER_MAP t0 ВНУТРЕННЕЕ СОЕДИНЕНИЕ APP.CHILD_MSG_USER_MAP t1 ON t0.CHILDMESSAGES_CHILD_ID = t1.CHILD_ID ГДЕ t0.PARENTMESSAGE_PARENT_ID = ?} [код=30000, состояние=42X05]

Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top