Задать вопрос

ORM Hibernate: Проблема с маппингом

Доброго времени суток!

Уже несколько недель, безуспешно пытаюсь решить проблему с хибернейтом ((

Перечитал кучу документации, прогуглил все, что только можно…

Подскажите, пожалуйста, в чем ошибка? Что я делаю не так?



Схема БД:
image


Маппинг:
(для генерации геттеров/сеттеров использую библиотеку lombok)

User.java
Copy Source | Copy HTML
  1. @Entity
  2. @Table(name = "users")
  3. public @Data class User
  4. {
  5.  
  6.     // Base Mapping
  7.  
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     @Column(name = "user_id")
  11.     @Getter @Setter Long user_id;
  12.  
  13.     @Column(name = "user_name")
  14.     private @Getter @Setter String user_name;
  15.  
  16.     @Column(name = "login")
  17.     private @Getter @Setter String login;
  18.  
  19.     @Column(name = "password")
  20.     private @Getter @Setter String password;
  21.  
  22.     // Releations Mapping
  23.  
  24.     // Releations With Project
  25.  
  26.     @ManyToMany(cascade={CascadeType.ALL})
  27.     @JoinTable(name="users_on_projects",
  28.             joinColumns=@JoinColumn(name="user_id"),
  29.             inverseJoinColumns=@JoinColumn(name="project_id") )
  30.             private @Getter @Setter List projects = new Vector();
     
     
        @OneToMany
        @JoinTable(name="users_on_projects",
                joinColumns=@JoinColumn(name="user_id"),
                inverseJoinColumns=@JoinColumn(name="users_on_projects_id") )
                private @Getter @Setter List intervals = new Vector();
    }


Project.java
Copy Source | Copy HTML
  1. @Entity
  2. @Table(name = "projects")
  3. public @Data class Project
  4. {
  5.  
  6.     // Base Mapping
  7.  
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     @Column(name ="project_id")
  11.     private @Getter @Setter Long project_id;
  12.  
  13.     @Column(name ="project_name")
  14.     private @Getter @Setter String project_name;
  15.  
  16.  
  17.     // Releations Mapping
  18.  
  19.     // Releations With User
  20.  
  21.       @ManyToMany(cascade={CascadeType.ALL})
  22.     @JoinTable(name="users_on_projects",
  23.             joinColumns=@JoinColumn(name="project_id"),
  24.             inverseJoinColumns=@JoinColumn(name="user_id") )
  25.       private @Getter @Setter List users = new Vector();
     
         @OneToMany
         @JoinTable(name="users_on_projects",
                joinColumns=@JoinColumn(name="project_id"),
                inverseJoinColumns=@JoinColumn(name="users_on_projects_id") )
                private @Getter @Setter List intervals = new Vector();


Interval.java
Copy Source | Copy HTML
  1. @Entity
  2. @Table(name = "intervals")
  3. public class Interval
  4. {
  5.     @Id
  6.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  7.     @Column(name = "interval_id")
  8.     @Getter @Setter Long interval_id;
  9.  
  10.     @Column(name ="start_time")
  11.     private @Setter @Getter
  12.                 @Temporal(javax.persistence.TemporalType.TIMESTAMP)
  13.                 Date start_time;
  14.  
  15.     @Column(name ="finish_time")
  16.     private @Setter @Getter
  17.             @Temporal(javax.persistence.TemporalType.TIMESTAMP)
  18.             Date FinishTime;
  19.  
  20.  
  21.     @ManyToOne(cascade={CascadeType.ALL})
  22.     @JoinTable(name="users_on_projects",
  23.             joinColumns=@JoinColumn(name="users_on_projects_id"),
  24.             inverseJoinColumns=@JoinColumn(name="user_id") )
  25.             private @Getter @Setter User user;
  26.  
  27.  
  28.     @JoinTable(name="users_on_projects",
  29.             joinColumns=@JoinColumn(name="users_on_projects_id"),
  30.             inverseJoinColumns=@JoinColumn(name="project_id") )
  31.             private @Getter @Setter
  32.     @ManyToOne
  33.              Project project;
  34.  
  35.  
  36.     @ManyToOne(cascade = CascadeType.ALL)
  37.     @JoinColumn(name="interval_type_id")
  38.     private @Getter @Setter IntervalType intervalType;
  39.  
  40. }


IntervalType.java
Copy Source | Copy HTML
  1. @Entity
  2. @Table(name = "interval_type")
  3. public class IntervalType
  4. {
  5.     @Id
  6.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  7.     @Column(name = "interval_type_id")
  8.     @Getter @Setter Long interval_type_id;
  9.  
  10.     @Column(name = "interval_type_name")
  11.     private @Getter @Setter String interval_type_name;
  12. }


Заранее благодарен!

UPD: На чтение все заработало.
Но, осталась проблема с записью интервалов (intervals).. Подскажите, что не так ?..


Корректный маппинг файла User.java :

Copy Source | Copy HTML
  1. @Entity
  2. @Table(name = "users")
  3. public @Data class User
  4. {
  5.  
  6.     // Base Mapping
  7.  
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     @Column(name = "user_id")
  11.     @Getter @Setter Long user_id;
  12.  
  13.     @Column(name = "user_name")
  14.     private @Getter @Setter String user_name;
  15.  
  16.     @Column(name = "login")
  17.     private @Getter @Setter String login;
  18.  
  19.     @Column(name = "password")
  20.     private @Getter @Setter String password;
  21.  
  22.     // Releations Mapping
  23.  
  24.     // Releations With Project
  25.  
  26.     @ManyToMany(cascade={CascadeType.ALL})
  27.     @JoinTable(name="users_on_projects",
  28.             joinColumns=@JoinColumn(name="user_id"),
  29.             inverseJoinColumns=@JoinColumn(name="project_id") )
  30.             private @Getter @Setter List projects = new Vector();

     
        @OneToMany
        @JoinTable(name="intervals",
                joinColumns=@JoinColumn(name="users_on_projects_id"),
                inverseJoinColumns=@JoinColumn(name="interval_id") )
                private @Getter @Setter List intervals = new Vector();
    }
  • Вопрос задан
  • 4654 просмотра
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
Foror
@Foror
Графоман
Я могу вам порекомендовать упрощать связи путем добавления классов. Например, в вашем случае, сделайте класс UserOnProject и думаю проблема разрешится сразу. А в последствии возможно этот класс еще и пригодится для новых атрибутов.
Ответ написан
Комментировать
Foror
@Foror
Графоман
И вообще, hibernate дофига памяти кушает. Очень дофига, по сравнению с теми же решениями на django, например, просто на порядки. Я со временем думаю, что-нибудь из NoSQL заюзать, тот же MongoDB, посмотреть, что из этого получится…
Ответ написан
Комментировать
asm0dey
@asm0dey
Извините, за кривое предложение, но можно сделать так:
Устанавливаем Spring Roo, настраиваем его на нашу БД, потом говорим database reverse engineer
Или НетБинс тоже умеет генерить маппинги по БД.
Ответ написан
asm0dey
@asm0dey
Как вариант скиньте мне схему БД, сгенерю сам.
Ответ написан
Комментировать
KriegeR
@KriegeR
Software Engineer
Прошу прощения, если я не прав (с Гибернейт очень давно дело не имел), но разве в маппинг-классах не должен быть конструктор по умолчанию?
Ответ написан
im_berzki
@im_berzki Автор вопроса
Проблема решена, всем спасибо за помощь !

Корректное описание отношения Users--->Intervals

@OneToMany
@JoinTable(name="intervals",
joinColumns=@JoinColumn(name="users_on_projects_id"),
inverseJoinColumns=@JoinColumn(name="interval_id") )
private @Getter @Setter List intervals = new Vector();


Я тут подумал, может быть, статью про маппинг сложных отношений написать?
И про маппинг на аннотациях/простенький пример? (вроде нет такой)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы