Hibernate 单向一对多映射

时间:2022-04-15 20:50:03

单向 n-1

  单向 n-1 关联只需从 n 的一段访问 1 的一端

  此处 Order 类和 Customer 类,其中 Order 类需要引用 Customer 类

  代码:

  

public class Customer {
private Integer id;
private String customerName; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getCustomerName() {
return customerName;
} public void setCustomerName(String customerName) {
this.customerName = customerName;
} }

Customer

public class Order {
private Integer id;
private String OrderName;
private Customer customer; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getOrderName() {
return OrderName;
} public void setOrderName(String orderName) {
OrderName = orderName;
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
} }

Order

<hibernate-mapping>
<class name="com.hibernate.entities.n21.Customer" table="CUSTOMERS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
</class>
</hibernate-mapping>

Customer.hbm.xml

<hibernate-mapping package="com.hibernate.entities.n21">
<class name="Order" table="ORDERS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="OrderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property>
<many-to-one name="customer" class="Customer" fetch="select">
<column name="CUSTOMER_ID" />
</many-to-one>
</class>
</hibernate-mapping>

Order.hbm.xml

  在 Order 的 hbm 配置文件中,使用了 <many-to-one> 的标签关联了 Customer 类

  其中 name 表示 Order 类中该属性的属性名

  class 表示关联的类的类名

  fetch 表示加载时的方式,join 表示从数据库获取 Order 类时,会一起把 Order 所关联的 Customer 一同加载到 session 缓存中,而 select 表示加载 Order 时,不加载所关联的Customer,只有当使用 customer 属性时,再加载到缓存中,Hibernate 默认值为 join

  当 customer 的一个对象被 order 对象引用时,不能在数据库中删除 customer,因为 order 数据表中有外键指向 customer 表