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>();

}

оставьте другую сущность такой, какая она есть. Надеюсь, это помогает.