У меня проблема с моделированием следующей проблемы в JPA. У меня есть класс сущности JPA «Пользователь», вот так:
(аксессоры / мутаторы / посторонние поля / посторонняя конфигурация JPA для краткости опущены)
@Entity
class User {
@Id
@Generated Value
long id;
@OneToMany
Report contributorReports; // All the reports where this user is contributor
@OneToMany ownerReports; // All the reports where this user is owner
String username;
}
и класс сущности JPA «Отчет»
@Entity
class Report {
@Id
@GeneratedValue
long id;
@OneToOne
User contributor;
@OneToOne
User owner;
SomeData data;
}
Я бы хотел смоделировать такие отношения, чтобы:
- Отчет должен содержать как участника, так и владельца.
- Я могу получить доступ ко всем отчетам, участником которых является пользователь, через пользовательскую сущность
- Я могу получить доступ ко всем отчетам, владельцем которых был пользователь, через пользовательскую сущность
Я предполагал, что в итоге получу таблицу сопоставления, которая выглядит примерно так:
CREATE TABLE user_report {
BIGINT reportId,
BIGINT contributorId,
BIGINT ownerId,
}
Я попытался решить проблему как:
@OneToOne
@JoinTable(name = "user_report",
joinColumns = {
@JoinColumn(name = "reportOwner_ID", referencedColumnName = "ID")}
)
private User owner;
@OneToOne
@JoinTable(name = "user_report",
joinColumns = {
@JoinColumn(name = "reportContributor_ID", referencedColumnName = "ID")}
)
private User contributor;
Это создает таблицу типа:
CREATE TABLE user_report (
BIGINT ownerReport_ID, // Report ID
BIGINT reportOwner_ID, // UserID owner
BIGINT contributorReport_ID, // Report ID
BIGINT reportContributor_ID // UserID contributor
)
Таким образом, когда JPA пытается сопоставить эту таблицу, оно сопоставляет каждое поле отдельно и завершается неудачей, потому что только половина строки фиксируется, вызывая это исключение:
Caused by: java.sql.BatchUpdateException: Field 'ownerReport_ID' doesn't have a default value
Я надеялся получить какое-то руководство о том, как лучше всего моделировать отношения, которые я представляю. (Или, может быть, лучший способ представить отношения) Если потребуется дополнительная информация, я буду рад ее предоставить.
С уважением
Matt