1

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

Вот мои классы:

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.jpgnote http://s018.radikal.ru/i516/1203/2f/6334aa0de3af.jpg

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

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

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

+0

Я использую MySQL, если он имеет любую ценность. А в консоли нет исключений – Michael

ответ

3

Вы должны установить 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); 
+0

Большое спасибо! Теперь я все понял – Michael