JPA Mapping Issue - запрошено направление моделирования - PullRequest
0 голосов
/ 09 августа 2010

У меня проблема с моделированием следующей проблемы в 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

1 Ответ

2 голосов
/ 09 августа 2010

Исходя из ваших требований, я полагаю, что вы выполняете это с помощью 2 1: M от пользователя к отчету с подходящим соотношением M: 1 для каждого.

@Entity
class User {
    @Id
    @Generated Value
    long id;

    // All the reports where this user is contributor
    @OneToMany(mappedBy="contributor")
    List<Report> contributorReports; 

    // All the reports where this user is owner
    @OneToMany(mappedBy="owner")
    List<Report> ownerReports; 

    String username;
}

Тогда ваш класс отчета будет выглядеть так:

@Entity
class Report {
    @Id
    @GeneratedValue
    long id;

    @ManyToOne
    User contributor;

    @ManyToOne
    User owner;

    SomeData data;
}

Такая ситуация также возможна с таблицей соединений, но не обязательна, исходя из ваших требований, насколько я понимаю.

Doug

...