JPA: несколько отношений "многие ко многим" между двумя сущностями?
Я пользователь двух классов сущностей 'и' документ'. Каждый пользователь имеет входящие и исходящие, которые на самом деле два списка, и каждый документ может находиться в нескольких входящих и исходящих пользователей. Вот мои занятия:
@Entity
public class User {
@Id
private Long id;
@ManyToMany(mappedBy = "userinbox", cascade=CascadeType.ALL)
private List<Document> inbox = new ArrayList<Document>();
@ManyToMany(mappedBy = "useroutbox", cascade=CascadeType.ALL)
private List<Document> outbox = new ArrayList<Document>();
}
@Entity
public class Document {
@Id
private Long id;
@ManyToMany(cascade=CascadeType.ALL)
private List<User> userinbox = new ArrayList<User>();
@ManyToMany(cascade=CascadeType.ALL)
private List<User> useroutbox = new ArrayList<User>();
}
когда я запускаю программу и пытаюсь назначить документ в папку "Входящие" пользователя (и наоборот), я получаю следующую ошибку:
Error Code: 1364
Call: INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?)
bind => [2 parameters bound]
Internal Exception: java.sql.SQLException: Field 'useroutbox_ID' doesn't have a default value
Query: DataModifyQuery(name="userinbox" sql="INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?)")
сгенерированная таблица ассоциаций выглядит следующим образом:
DOCUMENT_USER
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID
как бы я присвоить значения по умолчанию для такого отношения "многие ко многим"? Было бы лучше сделать две таблицы ассоциаций -> одна для inbox-relation, другая для outbox-relation? Как мне это сделать ? Другие решения этой проблемы ?
любая помощь высоко ценится-большое спасибо заранее!
1 ответов
Я думаю, что лучший вариант-иметь две отдельные таблицы, по одной на связи. Потому что на самом деле у вас есть два отношения между двумя разными сущностями, а не одно отношение с четырьмя разными сущностями.
Итак, вы должны добавить @JoinTable
аннотации к каждому из ваших атрибутов в Document
так User
сторона эти отношения сопоставляются со свойством. Что-то вроде следующего:
@Entity
public class Document {
@Id
private Long id;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "document_inbox", joinColumns = @JoinColumn(name = "userinbox_id"),
inverseJoinColumns = @JoinColumn(name = "inbox_id"))
private List<User> userinbox = new ArrayList<User>();
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "document_outbox", joinColumns = @JoinColumn(name = "useroutbox_id"),
inverseJoinColumns = @JoinColumn(name = "outbox_id"))
private List<User> useroutbox = new ArrayList<User>();
}
оставьте другую сущность такой, какая она есть. Надеюсь, это помогает.