1:

还是用客户Customer和订单Order来解释:

“一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户。

“双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪个客户。也就是说,通过客户对象可以检索到其拥有哪些订单;同时,通过订单也可以查找到其对应的客户信息。这是符合我们业务逻辑需求。

 1的1方
<set name="orders" table="ORDERS">
<key column="customer_Id"></key>
<one-to-many class="Order"/>
</set>
多的1方
<many-to-one name="customer" class="Customer" column="customer_Id"></many-to-one>

例子:

1的一方:

package com.hibernate.n21.both;

import java.util.HashSet;
import java.util.Set; public class Customer {
private Integer customerId;
private String customerName;
//双向1对多 在1的1方加一个set集合
    //需要把集合进行初始化。可防止空指针异常。
private Set<Order> orders =new HashSet<Order>(); public Set<Order> getOrders() {
return orders;
} public void setOrders(Set<Order> orders) {
this.orders = orders;
}
public Integer getCustomerId() {
return customerId;
} public void setCustomerId(Integer customerId) {
this.customerId = customerId;
} public String getCustomerName() {
return customerName;
} public void setCustomerName(String customerName) {
this.customerName = customerName;
} }

1的一方的配置文件:

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.n21.both"> <class name="Customer" table="customer"> <id name="customerId" type="java.lang.Integer">
<column name="customer_Id" />
<!-- 指定主键的生成方式, native: 使用数据库本地方式 -->
<generator class="native" />
</id> <property name="customerName"
type="java.lang.String" column="customer_Name" >
</property> <set name="orders" table="ORDERS">
<key column="customer_Id"></key>
<one-to-many class="Order"/>
</set> </class> </hibernate-mapping>

多的一方:

 package com.hibernate.n21.both;

 public class Order {
private Integer orderId;
private String orderName;
private Customer customer;
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
} }
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.n21.both"> <class name="Order" table="orders" > <id name="orderId" type="java.lang.Integer">
<column name="order_Id" />
<!-- 指定主键的生成方式, native: 使用数据库本地方式 -->
<generator class="native" />
</id> <property name="orderName"
type="java.lang.String" column="order_Name" >
</property> <!-- 映射n-1的关联关系 -->
<many-to-one name="customer" class="Customer" column="customer_Id"></many-to-one>
</class> </hibernate-mapping>

测试:

保存save():

@org.junit.Test
    public void testN21Save(){
        Customer customer=new Customer();
        customer.setCustomerName("AA");
        
        Order order1 =new Order();
        order1.setOrderName("order-1");
        
        Order order2 =new Order();
        order2.setOrderName("order-2");
        //会出现3个insert。2个update。  因为 1 的一端和 n 的一端都维护关联关系. 所以会多出 UPDATE
        //可以在 1 的一端的 set 节点指定 inverse=true, 来使 1 的一端放弃维护关联关系!
        //建议设定 set 的 inverse=true, 建议先插入 1 的一端, 后插入多的一端

inverse  相反的。反转。反转维护的方向。

inverse="true"。就是让1的一方放弃维护关系。因为我们都可以记住习大大。但是习大大不可能全记得我们

        //好处是不会多出 UPDATE 语句
        //设置关联关系。就是给多的一方设置外键
        order1.setCustomer(customer);
        order2.setCustomer(customer);
        
        customer.getOrders().add(order1);
        customer.getOrders().add(order2);         session.save(customer);
        session.save(order1);
        session.save(order2);
    }

查询:

 @org.junit.Test
public void testGet(){
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
}

只显示Customer。没有出现set集合的内容。

 @org.junit.Test
public void testGet(){
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
//2:class org.hibernate.collection.internal.PersistentSet 返回的hibernate内置的集合类型。
//这个类型具有延迟加载和存放代理对象的功能。
System.out.println(customer.getOrders().getClass()); }
@org.junit.Test
public void testGet(){
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
//class org.hibernate.collection.internal.PersistentSet 返回的hibernate内置的集合类型。
//这个类型具有延迟加载和存放代理对象的功能。
System.out.println(customer.getOrders().getClass());
//3:在查询完customer后就把session关闭。会出现懒加载异常。
session.close();
System.out.println(customer.getOrders().size());
}

4:在需要使用集合中元素的时候进行初始化。

删除:

 @org.junit.Test
public void testDelete(){
Customer customer=(Customer) session.get(Customer.class, 1);
session.delete(customer);
}

直接删除的话会报错。

在配置文件中的set集合。设置cascade属性。

这是级联删除。就是只要多的一方的外键是1的主键的。删除1。对应的多的全部删除掉。

<set name="orders" table="ORDERS" inverse="true" cascade="delete">

cascade="delete-orphan":删除孤儿。解除关联关系。把多的外键为1主键的都删除掉。因为解除关系了。变成孤儿了。

     save-update   级联保存。就是不用写session.save(order);

order-by属性:里面是数据库中的字段名。不是类的属性名。

hibernate 双向1对多的更多相关文章

  1. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...

  2. 注解:【无连接表的】Hibernate双向1->N关联

    Person与Address关联:双向1->N,[无连接表的],推荐使用 #由N端控制关联关系 #对于指定了mappedBy属性的@OneToMany,@ManyToMany,@OneToOne ...

  3. Hibernate双向多对多对象关系模型映射

    1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...

  4. hibernate 双向n-n

    领域模型: 关系数据模型 双向 n-n 关联须要两端都使用集合属性 双向n-n关联必须使用连接表 集合属性应添加 key 子元素用以映射外键列, 集合元素里还应添加many-to-many子元素关联实 ...

  5. hibernate 双向 1-n(具体分析)

    双向 1-n 与 双向 n-1 是全然同样的两种情形 双向 1-n 须要在 1 的一端能够訪问 n 的一端, 反之依旧. 域模型:从 Order 到 Customer 的多对一双向关联须要在Order ...

  6. hibernate双向一对多映射

    双向多对一 :Customer类------------>一的一端   Order类----------->多的一端 Customer类:(省略set().get()和构造方法) priv ...

  7. hibernate双向关联

    双向关联中最好的设置是一端为inverse=true,一端为inverse=false. falses维护,true不维护,设置多的一方维护(false) inverse属性就是用来规定是由谁来维护这 ...

  8. 注解:【基于外键的】Hibernate双向1->1关联

    Person与Address关联:双向1->1,[基于外键的]. #主表不应该控制关联关系.(否则会导致生成额外的update语句,从而导致性能下降), #因此主表对应的实体中使用@OneToO ...

  9. 注解:Hibernate双向N->N关联(两端都控制关联关系)

    Person与Address关联:双向N->N,[连接表必须有],两端都控制关联关系 #需要说明的是:如果程序希望某一端放弃控制关联关系,则可以在这一段的@ManyToMany注解中指定mapp ...

随机推荐

  1. 自建云存储:Nextcloud vs. ownCloud vs. Seafile

    Self-hosted Cloud Storage: Nextcloud vs. ownCloud vs. Seafile By Ashutosh KS in Hosting. Updated on ...

  2. SGU 194 Reactor Cooling (无源上下界网络流)

    The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...

  3. webpack对脚本和样式的处理

    一.对js处理 webpack本身支持js加载也可以用插件. 1.加载要全局使用的插件比如jquery 在页面用cdn方式引用,然后再webpack.config.js里配置.会让jquery成为全局 ...

  4. MySQL-5.7填坑

    绿色版(zip archive 版)无 my-default.ini As of MySQL 5.7.18, my-default.ini is no longer included in or in ...

  5. jmeter添加自定义扩展函数之MD5加密

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  6. [MAC]配置Jenkins 开机自启动

    如果是将jenkins.war放在tomcat中运行的, 则可以配置开机启动tomcat,脚本如下: XXX表示是你安装Tomcat所在目录 #启动tomcat cd XXX/Tomcat8/bin ...

  7. Appium移动端自动化:Api接口详解

    滑动操作与拖拽操作 # 滚动处理 # elementObj1 目标滚动元素,elementObj2 起始滚动元素 # 底层通过action操作,与web ui相反,origin_el为目标元素,des ...

  8. 基于全局地址池的DHCP

    一.实验目的 二.实验拓扑图 .三.实验编址 四.实验步骤 1.配置IP 2.配置基于全局地址池的DHCP server 使用IP pool命令创建一个新的全局地址池,名称为hjt1 配置hjt1可动 ...

  9. 【JavaScript性能优化】------理解Script标签的加载和执行

    1.script标签是如何加载的?当浏览器遇到一个 < script>标签时,浏览器会停下来,运行JavaScript代码,然后再继续解析.翻译页面.同样的事情发生在使用 src 属性加载 ...

  10. “希希敬敬对”队软件工程第九次作业-beta冲刺第六次随笔

    “希希敬敬对”队软件工程第九次作业-beta冲刺第六次随笔 队名:  “希希敬敬对” 龙江腾(队长) 201810775001 杨希                   201810812008 何敬 ...