Hibernate.Как правильно организовать отношение один-ко-многим с аннотациями? - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь сделать простой пример Hibernate.У меня есть две сущности: пользователь и примечание.Они имеют отношение один ко многим (один пользователь может иметь много заметок).Пожалуйста, помогите мне правильно отобразить эти отношения в базе данных, используя аннотации. Но я не хочу создавать третью таблицу для реализации отношения.Мне нужно иметь только две таблицы : screen http://s018.radikal.ru/i505/1203/4d/78c37e5dcefc.jpg

Вот мои уроки:

User.java :

@Entity
@Table(name = "user")
public class User {

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

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

@OneToMany(cascade = CascadeType.ALL, mappedBy="user") //Is it right value for  mappedBy-parameter?
private List<Note> notes = new ArrayList<Note>();

    // getters and setters

Note.java :

@Entity
@Table(name = "note")
public class Note {

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

@Column(name = "content")
private String content;

@ManyToOne
private User user;

    // getters and setters

Main.java :

public static void main(String[] args) {

    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null;
    try {
        transaction = session.beginTransaction();

        List<Note> notes = new ArrayList<Note>();
        Note note1 = new Note();
        note1.setContent("my first note");
        Note note2 = new Note();
        note2.setContent("my second note");
        notes.add(note1);       
        notes.add(note2);   
        User user = new User();
        user.setName("Andrei");
        user.setNotes(notes);
        session.save(user);

        transaction.commit();
    } catch (HibernateException e) {
        transaction.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }

}

hibernate.cfg.xml:

<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <property name="connection.pool_size">1</property>
    <property name="current_session_context_class">thread</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="show_sql">true</property>        
    <property name="hbm2ddl.auto">create-drop</property>
    <mapping class="com.vaannila.blog.User" />
    <mapping class="com.vaannila.blog.Note" />

После выполнения этого кода в моей базе данных Hibernate создал и заполнил две таблицы: user http://s16.radikal.ru/i191/1203/5a/a9d58a648e09.jpg note http://s018.radikal.ru/i516/1203/2f/6334aa0de3af.jpg

Но я сталкиваюсь спроблема: значение поля user_id равно нулю в таблице note . Хотя оно должно быть равно идентификатору пользователя (в данном случае 1).

Что нужно добавить в аннотации для решения этой проблемы и этого примера для правильной работы?Но без создания дополнительных таблиц.

Буду очень признателен за любую помощь!

1 Ответ

3 голосов
/ 05 марта 2012

Вы должны установить User внутри каждой заметки, так как вы определили двунаправленное отношение. Вместо того, чтобы позволять клиентам передавать список заметок напрямую, создайте User.addNote и настройте его правильно.

class User {
    ...
    public void addNote(Note note) {
        note.user = this;
        notes.add(note);
    }
}

Ваш тестовый код, таким образом, становится

Note note1 = new Note();
note1.setContent("my first note");
Note note2 = new Note();
note2.setContent("my second note");
User user = new User();
user.setName("Andrei");
user.addNote(note1);
user.addNote(note2);
session.save(user);

Вы можете улучшить это, добавив базовые поля в конструкторы ваших объектов, упростив приведенное выше до

User user = new User("Andrei");
user.addNote(new Note("my first note"));
user.addNote(new Note("my second note"));
session.save(user);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...