Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate annotations, many-to-many, не сохраняет 
V
    Опции темы
Galaran
Дата 14.9.2009, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.5.2009

Репутация: нет
Всего: 2



Решил разобраться с Hibernate по туториалам http://java-course.ru/students/content.html

Схема базы: http://java-course.ru/students/part15.html
Проблема со связью многие-ко-многим PROFESSION - SUBJECT через SPECIALITY_SUBJECT

Маппинги:

Код

@Entity
@Table(name = "SUBJECT")
public class Subject {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "subject_id")
      private Long subjectId;

      @Column(name = "subject_name")
      private String subjectName;
      
      @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
      @JoinTable(name = "SPECIALITY_SUBJECT",
                 joinColumns = @JoinColumn(name = "subject_id"),
                 inverseJoinColumns = @JoinColumn(name = "profession_id"))
      private List<Profession> professionList;

      // getters - setters -------------------------------

      ...
}


Код

@Entity
@Table(name = "PROFESSION")
public class Profession {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "profession_id")
      private Long professionId;

      @Column(name = "profession_name")
      private String professionName;

      @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
      @JoinTable(name = "SPECIALITY_SUBJECT",
                 joinColumns = @JoinColumn(name = "profession_id"),
                 inverseJoinColumns = @JoinColumn(name = "subject_id"))
      private List<Subject> subjectList;

      // getters - setters ----------------------------------------------------------------

      ...
}


Запускаю:
Код

            System.out.println(dao.getSubjectList().size());
            System.out.println(dao.getSubjectList().get(0).getSubjectName());
            
            System.out.println(dao.getProfessionByName("Admin").getProfessionName());

            // Insert
            dao.getProfessionByName("Admin").getSubjectList().add(dao.getSubjectList().get(0));
            System.out.println(dao.getProfessionByName("Admin").getSubjectList().size());


используемые методы класса dao:

Код

public List<Subject> getSubjectList() {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            // HQL query
            List<Subject> result = session.createQuery("from Subject order by subjectName").list();
            session.getTransaction().commit();
            return result;
}

public Profession getProfessionByName(String prof) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            Profession result = (Profession)session.createQuery(
                    "from Profession prof where prof.professionName = '" + prof + "'").uniqueResult();
            session.getTransaction().commit();
            return result;
}


Результат:

Код

1
Math
Admin
0


Т.е. видно, что hibernate находит Subject, находит Profession

А вот ассоциироваться они не хотят (пробовал 2 варианта)

Код

dao.getProfessionByName("Admin").getSubjectList().add(dao.getSubjectList().get(0));

Код

dao.getProfessionByName("Admin").setSubjectList(dao.getSubjectList());


Результат один и тот же. Где моя ошибка ?
PM MAIL   Вверх
Juggernaut
Дата 14.9.2009, 08:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2



Добрый день.
Hibernate сохраняет в таблицу связей в момент коммита в БД.

Т.е. Ваш код сейчас работает примерно так:

Код

dao.getProfessionByName("Admin").//получили объект из БД
getSubjectList().add(dao.getSubjectList().get(0));//добавили в него другой объект-связь
//НЕ СОХРАНИЛИ            
System.out.println(dao.getProfessionByName("Admin").//опять получили тот же объект из БД
getSubjectList().size()); //FAIL


Я думаю надо так:
Код

dao.getProfessionByName("Admin").//получили объект из БД
getSubjectList().add(dao.getSubjectList().get(0));//добавили в него другой объект-связь
//вызвали метод сохранения или обновления (aka updateProfession())
System.out.println(dao.getProfessionByName("Admin").//опять получили объект из БД
getSubjectList().size()); //PROFIT


PM MAIL   Вверх
Galaran
Дата 15.9.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.5.2009

Репутация: нет
Всего: 2



Да, оно самое, спасибо

Код

System.out.println(dao.getProfessionByName("Test").getSubjectList().size());

Profession prof = dao.getProfessionByName("Test");
prof.getSubjectList().add(dao.getSubjectList().get(0));
dao.updateProfession(prof);

System.out.println(dao.getProfessionByName("Test").getSubjectList().size());


Код

0
1

?????
Действительно PROFIT  smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.