Hibernate 双向一对多映射
附代码:
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; } }
public class Customer { private Integer id; private String customerName; private Set<Order> orders = new HashSet<>(); public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } 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; } }
<hibernate-mapping package="com.hibernate.entities.n21.both"> <class name="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> <set name="orders" table="ORDERS" inverse="true"> <key> <column name="CUSTOMER_ID"></column> </key> <one-to-many class="Order"/> </set> </class> </hibernate-mapping>
<hibernate-mapping package="com.hibernate.entities.n21.both"> <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="join"> <column name="CUSTOMER_ID" /> </many-to-one> </class> </hibernate-mapping>
首先,在 Customer 类中添加了 Set 类型的 orders 属性,用来映射 Order。
Order 数据表通过 Customer_Id 来映射 Customer
在 .hbm.xml mapping 文件中,Customer 使用 set 节点设置了 orders 属性
<set name="orders" table="ORDERS" inverse="true"> <key> <column name="CUSTOMER_ID"></column> </key> <one-to-many class="Order"/> </set>
其中:
name 表示 Customer 中该属性的名字
table 表示所映射的对象的数据表的表名
inverse 用来设置由谁来维护映射关系,inverse 英文意思是相反的,此处设置为 true ,意思是让对方来维护映射关系。inverse 的默认值为 false
子节点 key :用来设置通过哪个列来检索所映射的对象
one-to-many:通过设置 class 属性来指定所映射的对象的类名
order-by:设置 Set 集合中对象如何排序,如:order-by=“Order_Name Desc”,其中 Order_Name 表示数据表中的列名, Desc 表示排序方式
在这里,可以通过设置 cascade 来设置级联关系,具体可以百度,教程中建议不用这个属性,但感觉这个属性还是很方便的,此处留个记号,以后研究
精诚所至,金石为开。