我试图做一个Hibernate的简单例子。我有两个实体:User和Note。它们具有一对多的关系(一个用户可以有很多笔记)。请帮我使用注释在数据库中正确显示这些关系。但我不想创建第三个表来实现关系。我需要只有两个表: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
但是我遇到了一个问题: note 表中的字段 user_id 值为空。虽然它必须等于用户ID(在本例中为1)。
我需要添加哪些注释来解决此问题,并且此示例才能正常工作?但是没有创建额外的表格。
我真的很感激任何帮助!
答案 0 :(得分: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);