Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate @OneToMany @ManyToOne / 25 сообщений из 34, страница 1 из 2
05.02.2012, 01:15:17
    #37647369
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Здравствуйте. Помогите пожалуйста.

Есть три сущности: Users, Books, Comments
Users @OneToMany Comments
Books @OneToMany Comments
Comments @ManyToOne Users, Books

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
@Table(name = "Users")
public class Users implements Serializable{
   @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;
   
   @OneToMany(targetEntity = Comments.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   private List<Comments> commentsForUser;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
@Table(name ="Books")
public class Books implements Serializable {
  @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private Long bookId;
  
    @OneToMany(targetEntity = Comments.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Comments> commentsForBook;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Entity
@Table(name ="Comments")
public class Comments implements Serializable{
   @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long commentId;
   
   @ManyToOne(targetEntity = Users.class, cascade = {CascadeType.REFRESH}, fetch =FetchType.LAZY)
   @JoinColumn(name = "user_id")
   private Users user;
   
    @ManyToOne(targetEntity = Books.class, cascade = {CascadeType.REFRESH}, fetch =FetchType.LAZY)
    @JoinColumn(name = "book_id")
    private Books book;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
public class Main {

    public static void main(String[] args) {
    
        Session session = HibernateUtil.getSessionFactory().openSession();
       
        session.beginTransaction();
        Books book = new Books();
        book.setBook("Книга краба");
        book.setAutor("Краб");
        book.setDescription("Книга краба, классная");
        book.setImage("Ссылка на картинку для книги");
        book.setFile("Ссылка на файл для книги");
        book.setNumberComments(0);
        book.setNumberDownloads(0);
        book.setYearToPublication(2009);
        session.save(book);
        session.getTransaction().commit();
        
        session.beginTransaction();
        Users user = new Users();
        user.setLogin("krab");
        user.setPassword("qwerty");
        user.setName("Андрей");
        user.setSName("Коваленко");
        user.setOnLibrary(true);
        user.setCommentsNumber(1);
        user.setRegisterDate(new Date(System.currentTimeMillis()));
        session.save(user);
        session.getTransaction().commit();
        
        
        session.beginTransaction();
        Comments comment = new Comments();
        comment.setTextComment("Классная книга");
        comment.setDateOfComment(new Date(System.currentTimeMillis()));
        comment.setUser(user);
        comment.setBook(book);
        session.save(comment);
        session.getTransaction().commit();
        
        session.close();
        
       System.out.println(user.getCommentsForUser());
       System.out.println(book.getCommentsForBook());
        
        
    }
}



В консоль выводит:
Код: plsql
1.
2.
3.
4.
5.
Hibernate: insert into Books (autor, book, description, file, image, numberComments, number_Downloads, year_to_publication) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Users (comments_Number, login, name, on_Library, password, register_Date, s_Name) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Comments (book_id, date_of_comment, text_comment, user_id) values (?, ?, ?, ?)
null
null



По идее как я понимаю null не должно выводить. Подскажи, может аннотации @OneToMany и @ManyToOne не правильно написал?


Заранее спасибо.
...
Рейтинг: 0 / 0
05.02.2012, 11:34:19
    #37647465
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Это все должно выглядеть примерно вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
@Table(name = "Users")
public class Users implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;
   
    @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
    private List<Comments> commentsForUser;


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
@Table(name ="Books")
public class Books implements Serializable {
  @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private Long bookId;
  
    @OneToMany(mappedBy="book", cascade = CascadeType.ALL)
    private List<Comments> commentsForBook;


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Entity
@Table(name ="Comments")
public class Comments implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long commentId;
   
    @ManyToOne(cascade = {CascadeType.REFRESH})
    @JoinColumn(name = "user_id")
    private Users user;
   
    @ManyToOne(cascade = {CascadeType.REFRESH})
    @JoinColumn(name = "book_id")
    private Books book;
...
Рейтинг: 0 / 0
05.02.2012, 13:46:13
    #37647560
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Спасибо, поменял, все-равно не работает, также выводит ссылки null.
Может в чем-то другом проблема?

Заранее спасибо.
...
Рейтинг: 0 / 0
05.02.2012, 15:09:53
    #37647618
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Попробуйте cascade = {CascadeType.REFRESH} поменять на cascade = {CascadeType.ALL}
НО!!! Возьмите себе за правило, что когда имеете дело с двунаправленными отношениями, то явно обновляйте их с обоих сторон. Т.е. вместо
Код: java
1.
comment.setUser(user);

надо писать
Код: java
1.
2.
comment.setUser(user);
user.getComments().add(comment);
...
Рейтинг: 0 / 0
05.02.2012, 15:48:33
    #37647653
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
авторПопробуйте cascade = {CascadeType.REFRESH} поменять на cascade = {CascadeType.ALL}
Поменял. Также выдает null

Код: java
1.
2.
comment.setUser(user);
user.getComments().add(comment);



После этого конечно поля заполнены, но это ручная работа.Не понимаю тогда смысла данных аннотаций. Я думал что поля должны заполнятся автоматически. Хотя конечно тут ключевое слово "думал" :)
...
Рейтинг: 0 / 0
05.02.2012, 18:57:32
    #37647756
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Скорее всего, это связано с тем, что вы каждое действие делаете в отдельной транзакции.
Попробуйте сделать все в одной транзакции, а для записи изменений в базу используйте session.flush().
...
Рейтинг: 0 / 0
06.02.2012, 00:32:03
    #37647976
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Это то есть примерно так?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
    public static void main(String[] args) {
    
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();

        Books book = new Books();
        book.setBook("Книга краба");
        ...
        session.flush();
        
        Users user = new Users();
        user.setLogin("krab");
        ...
       session.flush();
      
       Comments comment = new Comments();
       comment.setTextComment("Классная книга");
       ...
        session.flush();

        session.save(book);
        session.save(user);
        session.save(comment);

        session.getTransaction().commit();
        
        session.close();
        
       System.out.println(user.getCommentsForUser());
       System.out.println(book.getCommentsForBook());
        
        
    }

        



Все-равно выводит нулл)
...
Рейтинг: 0 / 0
06.02.2012, 00:32:50
    #37647977
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Хотя конечно если явно обновлять, то все ок
...
Рейтинг: 0 / 0
06.02.2012, 07:27:55
    #37648057
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krab,

Убери все лишние поля из примера и обьясни БЛ по связям. Для какой задачи они нужны.
...
Рейтинг: 0 / 0
06.02.2012, 08:51:23
    #37648086
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krab,

Попробуйте оставить один flush в самом конце.
...
Рейтинг: 0 / 0
06.02.2012, 11:28:36
    #37648294
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Petro123,

Есть 3 таблицы. Users, Books, Comments

Users имеет много комментариев, то есть связь один ко многим:

Код: java
1.
2.
    @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
       private List<Comments> commentsForUser;



Books имеет много комментариев, то есть связь один ко многим:

Код: java
1.
2.
    @OneToMany(mappedBy="book", cascade = CascadeType.ALL)
       private List<Comments> commentsForBook;



Comments соответственно:

Код: java
1.
2.
3.
4.
5.
6.
7.
    @ManyToOne(cascade = {CascadeType.ALL})
        @JoinColumn(name = "user_id")
        private Users user;
       
        @ManyToOne(cascade = {CascadeType.ALL})
        @JoinColumn(name = "book_id")
        private Books book;



Хочу чтоб при заполнении полей авторprivate Books book; и авторprivate Users user;
автоматически добавлялись комментарии в списки авторprivate List<Comments> commentsForUser; и
авторprivate List<Comments> commentsForBook;
...
Рейтинг: 0 / 0
06.02.2012, 11:30:39
    #37648297
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Leonidv,

Не помогло)
...
Рейтинг: 0 / 0
06.02.2012, 11:36:49
    #37648312
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krabComments соответственно:
доп.вопрос - зачем в комментарии тебе доп.ссылки на родителей?
...
Рейтинг: 0 / 0
06.02.2012, 11:43:03
    #37648324
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krab,
вопрос снимается. Позже в коде посмотрю - отвечу.

Общий случай тебе svenom сказал - вручную и небольшая автоматизация при inverse = True 2 метода объединить в один.
...
Рейтинг: 0 / 0
06.02.2012, 11:54:50
    #37648353
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krab,
ну, давай попробуем....
По логике не вяжется.
- Зачем нужны о одних комментариев - 2 родителя?
- Что за комментарии у Books?
IMHO неправильные ассоциации в модели предметной области.
...
Рейтинг: 0 / 0
06.02.2012, 11:59:11
    #37648361
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
В объектной модели все в порядке. Каждый комментарий связан с прокомментированной книгой и с пользователем, который его оставил. Логично, что в какой-то момент мы можем захотеть посмотреть все комментарии к данной книге или все комментарии данного пользователя. Логично и разумно.
...
Рейтинг: 0 / 0
06.02.2012, 12:05:17
    #37648379
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
svenomВ объектной модели все в порядке. Каждый комментарий связан с прокомментированной книгой и с пользователем, который его оставил. Логично, что в какой-то момент мы можем захотеть посмотреть все комментарии к данной книге или все комментарии данного пользователя. Логично и разумно.
я не спорю, я предлагаю ВРЕМЕННО убрать ЧТО МЫ ХОТИМ СМОТРЕТЬ и отработать персистентность.
Т.е. легко и просто сохранять в БД
Или ИДТИ ОТ БД а не от ОРМ.
От ОРМ можно пойти через 15 минут.
...
Рейтинг: 0 / 0
06.02.2012, 12:13:23
    #37648401
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krab,
предметная область.
От неё зависит модель.
- что является ПРЕДМЕТОМ учёта?
Вариант:
Книги много комментариев + пользователь
или
Код: java
1.
2.
Книги Один ко многим --> комментарии
Комментарий 1 к 1 --> пользователь



______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
06.02.2012, 15:22:46
    #37648755
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Petro123,
Я ценю Вашу помощь, но немного не понимаю Вас.

Предметная область вроде и так должна быть ясна. Обычная библиотека с книгами.
Каждая книга может иметь множество комментариев. Также и пользователь может иметь множество комментариев.
Книги один ко многим -> Комментарии
Пользователь один ко многим -> Комментарии
...
Рейтинг: 0 / 0
06.02.2012, 15:29:07
    #37648767
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krabPetro123,
Предметная область вроде и так должна быть ясна. Обычная библиотека с книгами.

===== нет, если главный - Комментатор или Писатель, то модель будет другая.
Предположим что - Библиотека - OK

Каждая книга может иметь множество комментариев. Также и пользователь может иметь множество комментариев.

нет.
Пользователь имеет множество только опосредствованно, по ссылке через другой объект.
Т.е. сам по себе, без книг, он имеет комментарии только по ДОП.запросу _аналитическому_ в БД.

Т.е. он имеет множество комментарие, но только через книги которые комментирует.

Ведь комментарий без книги невозможен? (NOT NULL)
?
...
Рейтинг: 0 / 0
06.02.2012, 15:30:54
    #37648771
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
пы сы - отформатировал
krabPetro123,
Предметная область вроде и так должна быть ясна. Обычная библиотека с книгами.

===== нет, если главный - Комментатор или Писатель, то модель будет другая.
Предположим что - Библиотека - OK

Каждая книга может иметь множество комментариев. Также и пользователь может иметь множество комментариев.

нет.
Пользователь имеет множество только опосредствованно, по ссылке через другой объект.
Т.е. сам по себе, без книг, он имеет комментарии только по ДОП.запросу _аналитическому_ в БД.

Т.е. он имеет множество комментарие, но только через книги которые комментирует.

Ведь комментарий без книги невозможен? (NOT NULL)
?
...
Рейтинг: 0 / 0
06.02.2012, 15:33:20
    #37648773
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krab,
не забывайте про БД и 3 степени нормализации.
Покажите 3 таблички с 2-мя заполненными строками. Как бы вы хотели видеть в БД.
У нас ООБД пока не существует.
...
Рейтинг: 0 / 0
06.02.2012, 15:37:54
    #37648784
krab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
Petro123,

авторВедь комментарий без книги невозможен?
Да, также и книгу нельзя посмотреть без входа в библиотеку.
...
Рейтинг: 0 / 0
06.02.2012, 15:49:37
    #37648808
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
krabPetro123,
авторВедь комментарий без книги невозможен?
Да, также и книгу нельзя посмотреть без входа в библиотеку.
класса библиотеки у нас нету :)

Держи вариант:
ВИ - User - справочник а не встроенный класс в Коммент
Применяют когда выделенный класс User достаточно большой и его выбирают на клиенте из комбобокса.
====================
Книги ----много ко много -------Пользователь
1 Книга - много комментариев (1 к *)
Комментарий - справочникПользователь (FK)

авторКнига
код Название1 ВойнаИмир2 Мурзилка

авторКоммент
код кодКниги FKUser Текст23 2 34 Плохая45 2 34 Супер

авторUser
код FIO34 Петров34 Сидоров
вот эту схему БД пробуй промаппить на ОРМ.
...
Рейтинг: 0 / 0
06.02.2012, 15:56:49
    #37648825
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate @OneToMany @ManyToOne
да, каскад на удаление только с книги на коммент. База юзверей не удаляется.
Получится маппинг с минимумом полей в классах напиши.
Удачи!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate @OneToMany @ManyToOne / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]