JSP开发之hibernate之单向多对一关联的实例
在Hibernate中,多对一关系是常见的一种关系,也是应用较广的关系之一。本文将讲解如何使用Hibernate实现单向多对一关联。
创建多对一关联的实体类
在Hibernate中,实现多对一关联关系时,需要定义一个实体类作为“多”的一方,在该实体类中声明一个关联的对象,使用引用类型(通常为另一个实体类的主键类型)来表示。举个例子,我们创建两个实体类Order
和Customer
,创建多对一关联关系。其中,一个订单只能属于一个客户,而一个客户可以拥有多个订单,代码如下:
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
private Long id;
private String orderNo;
@ManyToOne
@JoinColumn(name = "customerId")
private Customer customer;
// 省略getter/setter方法
}
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue
private Long id;
private String name;
private String mobile;
@OneToMany(mappedBy = "customer")
private List<Order> orders;
// 省略getter/setter方法
}
在Order
实体类中,使用了@ManyToOne
注解表示多对一关联,同时在JoinColumn
注解中指定了关联的外键名。在Customer
实体类中,使用了@OneToMany
注解表示一对多关联关系,mappedBy
属性用于指明数据库中关联表中的对应字段。
创建DAO层代码
在Hibernate中,我们使用DAO层来完成对实体类的增删改查等操作。下面是DAO层代码的实现:
public class OrderDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void save(Order order) {
Session session = sessionFactory.getCurrentSession();
session.save(order);
}
public Order getById(Long id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Order.class, id);
}
}
public class CustomerDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void save(Customer customer) {
Session session = sessionFactory.getCurrentSession();
session.save(customer);
}
public Customer getById(Long id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Customer.class, id);
}
}
在DAO层代码中,我们使用SessionFactory
来获取Session
对象,然后使用Session
对象完成对实体类的增删改查等操作。
创建Hibernate的配置文件
在使用Hibernate时,我们需要创建Hibernate的配置文件,用于指定数据库连接信息、实体类的映射关系等。下面是Hibernate的配置文件hibernate.cfg.xml
的实现:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useSSL=false</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.show_sql">true</property>
<mapping class="com.example.model.Order" />
<mapping class="com.example.model.Customer" />
</session-factory>
</hibernate-configuration>
在hibernate.cfg.xml
中,我们指定了MySQL数据库的连接信息,同时也指定了实体类的映射关系。
测试Hibernate的多对一关联
下面是我们对Hibernate的多对一关联进行测试的代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-hibernate.xml"})
public class OrderDaoTest {
@Autowired
private OrderDao orderDao;
@Autowired
private CustomerDao customerDao;
@Test
public void testSaveOrderAndCustomer() {
Customer customer = new Customer();
customer.setName("张三");
customer.setMobile("13912345678");
customerDao.save(customer);
Order order1 = new Order();
order1.setOrderNo("20170001");
order1.setCustomer(customer);
orderDao.save(order1);
Order order2 = new Order();
order2.setOrderNo("20170002");
order2.setCustomer(customer);
orderDao.save(order2);
Order order = orderDao.getById(order1.getId());
assertNotNull(order);
assertEquals("20170001", order.getOrderNo());
assertEquals("张三", order.getCustomer().getName());
assertEquals("13912345678", order.getCustomer().getMobile());
}
}
在测试代码中,我们首先实例化了一个Customer
对象并保存到数据库中,然后实例化了两个Order
对象并关联到之前创建的Customer
对象,最后通过OrderDao
对数据库进行了操作,最后通过Assert
对数据进行验证。
示例说明
下面是两个常见的多对一关联的示例:
一对多
在一个部门拥有多个员工的情况,一个员工只能属于一个部门,代码如下:
@Entity
@Table(name = "departments")
public class Department {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// 省略getter/setter方法
}
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue
private Long id;
private String name;
private String mobile;
@ManyToOne
@JoinColumn(name = "departmentId")
private Department department;
// 省略getter/setter方法
}
在Department
实体类中,使用了@OneToMany
注解表示一对多关联,mappedBy
属性用于指明数据库中关联表中的对应字段。在Employee
实体类中,使用了@ManyToOne
注解表示多对一关联,同时在JoinColumn
注解中指定了关联的外键名。
多对一
在一个订单拥有多个商品的情况,一个商品只能属于一个订单,代码如下:
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
private Long id;
private String orderNo;
@ManyToOne
@JoinColumn(name = "productId")
private Product product;
// 省略getter/setter方法
}
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
private double price;
@OneToMany(mappedBy = "product")
private List<Order> orders;
// 省略getter/setter方法
}
在Order
实体类中,使用了@ManyToOne
注解表示多对一关联,同时在JoinColumn
注解中指定了关联的外键名。在Product
实体类中,使用了@OneToMany
注解表示一对多关联,mappedBy
属性用于指明数据库中关联表中的对应字段。
总结
本文通过一个实例,详细介绍了如何使用Hibernate实现单向多对一关联。实现步骤包括定义实体类、创建DAO层代码、创建Hibernate的配置文件,以及进行测试。同时,也给出了两种常见的多对一关联的示例,希望能够对大家掌握Hibernate的多对一关联关系有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP开发之hibernate之单向多对一关联的实例 - Python技术站