简单了解了hibernate注解annotation后,我们来看下怎样用注解实现单/双向的多对一映射。
新建一个java项目,结构如下:
单向多对一映射
Book类
package com.test.pojo;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
//entity表示需要持久化的实体类
@Entity
//表示实体类所对应的表
@Table(name="t_book")
public class Book {
//id主键
@Id
//指定主键生成策略
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name="name")
private String name;
@Column
private double price;
private String author;
private Date pubDate;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="category_id")
private Category category;
//省略get/set
}
category类
@Entity
@Table
public class Category {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
//省略get/set
}
hibernate.cfg.xml配置文件
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql:///hibernatetest
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping class="com.test.pojo.Book" />
<mapping class="com.test.pojo.Category" />
</session-factory>
</hibernate-configuration>
测试类
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
se.create(true, true);
}
@Test
public void testSave(){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Book book=new Book();
book.setName("读者");
book.setPrice(21.5);
book.setAuthor("读者出版传媒有限公司");
book.setPubDate(new Date());
Category category=new Category();
category.setName("文学");
book.setCategory(category);
session.save(book);
tx.commit();
HibernateUtil.closeSession();
}
@Test
public void testGet(){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Book book=(Book) session.get(Book.class, 1);
System.out.println(book.getName()+"----"+book.getCategory().getName());
}
}
HibernateUtil类请参考文章 《hibernate注解annotation入门》。
测试类运行结果就不做详细展示了,感兴趣的可以自己测试下。
双向多对一映射
这里只展示与单向多对一映射不同的地方。
category类
@Entity
@Table
public class Category {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
//在多对一中的一端,设置了OneToMany后,必须指定mappedBy=多端的属性,这里的多端是Book
@OneToMany(mappedBy="category")
private Set<Book> books=new HashSet<Book>();
//省略get/set
}