У меня возникла проблема моделирования следующей проблемы в JPA. У меня есть JPA Entity класс 'User', например, так: (Accessors/Мутаторы/постороннее поле/постороннее конфигурации 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 'Report'
@Entity
class Report {
@Id
@GeneratedValue
long id;
@OneToOne
User contributor;
@OneToOne
User owner;
SomeData data;
}
Я хотел бы моделировать отношения, такие, что:
- Отчет должен содержать как вкладчик и владелец
- I ча п доступ ко всем отчетам Пользователь был «донором» для через User Entity
- я могу получить доступ ко всем отчетам пользователя был «владельцем» для через User Entity
я представлял Я бы в конечном итоге с таблицей отображения, который выглядел неопределенно, как это:
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
I надеялся получить какое-то направление в отношении того, как наилучшим образом моделировать отношения, которые я себе представляю. (Или, может быть, лучший способ представить себе отношения). Если вам нужна дополнительная информация, я буду рад предоставить ее.
С наилучшими пожеланиями Мэтт
Почему вы используете '@ OneToOne' на стороне отчета, он должен быть' @ ManyToOne'. – axtavt