2010-08-09 5 views
0

У меня возникла проблема моделирования следующей проблемы в 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 надеялся получить какое-то направление в отношении того, как наилучшим образом моделировать отношения, которые я себе представляю. (Или, может быть, лучший способ представить себе отношения). Если вам нужна дополнительная информация, я буду рад предоставить ее.

С наилучшими пожеланиями Мэтт

+0

Почему вы используете '@ OneToOne' на стороне отчета, он должен быть' @ ManyToOne'. – axtavt

ответ

2

Исходя из ваших требований, я считаю, вы сделать это с 2-1: 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

+0

Спасибо, Дуг, это было именно то, что мне нужно! Лес для деревьев и все такое. – Matt

Смежные вопросы