Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

2020-11-24 10:52

阅读:564

标签:style   blog   class   code   java   ext   

1、项目结构:

     soscw.com,搜素材

1.1、场景说明: 一个订单,包含多个产品

1.2、类文件:

    Order.java 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.rhythmk.model;
 
import java.util.Date;
 
public class Order {
    public int getOrderID() {
        return orderID;
    }
 
    public void setOrderID(int orderID) {
        this.orderID = orderID;
    }
 
    public String getName() {
        return Name;
    }
 
    public void setName(String name) {
        Name = name;
    }
 
    public double getSumMoney() {
        return SumMoney;
    }
 
    public void setSumMoney(double sumMoney) {
        SumMoney = sumMoney;
    }
 
    public Date getCreateDate() {
        return createDate;
    }
 
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
 
    private  int  orderID;
    private String  Name;
    private double SumMoney;
     
    @Override
    public String toString() {
        return "Order [orderID=" + orderID + ", Name=" + Name + ", SumMoney="
                + SumMoney + ", createDate=" + createDate + "]";
    }
 
    private Date createDate;
     
}

 order.hbm.xml

soscw.com,搜素材
xml version="1.0" encoding="utf-8"?>
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

hibernate-mapping>
    class name="com.rhythmk.model.Order" table="t_order">
        id name="orderID" type="int">
            column name="orderID" />
            generator class="native" />
        id>
        property name="Name" type="string">
            column name="Name" not-null="true" />
        property>
       property name="SumMoney" type="double">property>
        property name="createDate" type="timestamp">
            column name="createDate" not-null="true" />
        property>
     
    class>
hibernate-mapping>
soscw.com,搜素材

    Product.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.rhythmk.model;
 
public class Product {
    public int getProductID() {
        return productID;
    }
 
    public void setProductID(int productID) {
        this.productID = productID;
    }
 
    public String getProductName() {
        return productName;
    }
 
    public void setProductName(String productName) {
        this.productName = productName;
    }
 
    private int productID;
    private String productName;
     
    public Order getOrder() {
        return order;
    }
 
    public void setOrder(Order order) {
        this.order = order;
    }
 
    private Order order ;
 
    @Override
    public String toString() {
        return "Product [productID=" + productID + ", productName="
                + productName + ", order=" + order + "]";
    }
     
}

  product.hbm.xml

soscw.com,搜素材
xml version="1.0" encoding="utf-8"?>
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

hibernate-mapping>
    class name="com.rhythmk.model.Product" table="t_product">
        id name="productID" type="int">
            column name="productID" />
            generator class="native" />
        id>
        property name="productName" type="string">
            column name="productName"  />
        property>
           many-to-one name="order"   column="orderID">many-to-one> 
     
    class>
hibernate-mapping>
soscw.com,搜素材

hibernate.cfg.xml

soscw.com,搜素材
xml version=‘1.0‘ encoding=‘UTF-8‘?>
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="dialect">org.hibernate.dialect.MySQLDialectproperty>
        property name="connection.url">jdbc:mysql://localhost:3306/hibernate_demoproperty>
        property name="connection.username">rootproperty>
        property name="connection.password">wangkunproperty>
        property name="connection.driver_class">com.mysql.jdbc.Driverproperty>
        property name="myeclipse.connection.profile">com.mysql.jdbc.Driverproperty>
        
        property name="hibernate.show_sql">true property>
        property name="hibernate.hbm2ddl.auto">updateproperty>
        
          mapping  resource="com/rhythmk/model/user.hbm.xml" />
         mapping  resource="com/rhythmk/model/product.hbm.xml" /> 
          mapping resource="com/rhythmk/model/order.hbm.xml" />
    session-factory>

hibernate-configuration>
soscw.com,搜素材

 

1.3  、结论:

        在Many方 定义XML配置  :

soscw.com,搜素材
      many-to-one name="order"   column="orderID">many-to-one> 
soscw.com,搜素材

   写入数据调用session.save方法跟单表保存基本一致。

   读取数据:获取Many对象,默认 One对象都是以延迟加载模式进行加载。

    不论是删除 Many ,还是删除 One 对象 都只删除本身数据 ,并非删除全部主从数据,如果删除One对象,一旦Many还有关联One的对象的存在,则将抛出异常。见(test04_del)

 1.4  、测试验证:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Test
    public void test02_add() {
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            Order order = new Order();
            order.setCreateDate(new Date());
            order.setName("订单一");
            order.setSumMoney(12);
            session.save(order);
 
            Product p1 = new Product();
            p1.setOrder(order);
            p1.setProductName("产品1");
            session.save(p1);
 
            Product p2 = new Product();
            p2.setOrder(order);
            p2.setProductName("产品2");
            session.save(p2);
 
            session.getTransaction().commit();
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (session != null)
                session.close();
        }
    }

  输出:

Hibernate: insert into t_order (Name, SumMoney, createDate) values (?, ?, ?)
Hibernate: insert into t_product (productName, orderID) values (?, ?)
Hibernate: insert into t_product (productName, orderID) values (?, ?)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Test
public void test03_load() {
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        Order order = (Order) session.load(Order.class, 1);
        System.out.println(order);
        System.out.println("-----------Read  Product-----------");
        Product product = (Product) session.load(Product.class, 1);
        System.out.println("-----------Print  Product-----------");
        System.out.println(product);
        System.out.println("-----------Read  Order-----------");
        System.out.println(product.getOrder().getName());
 
 
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (session != null)
            session.close();
    }
}

  

输出:

Hibernate: select order0_.orderID as orderID1_0_0_, order0_.Name as Name2_0_0_, order0_.SumMoney as SumMoney3_0_0_, order0_.createDate as createDa4_0_0_ from t_order order0_ where order0_.orderID=?
Order [orderID=1, Name=订单一, SumMoney=12.0, createDate=2014-05-02 15:24:02.0]
-----------Read Product-----------
-----------Print Product-----------
Hibernate: select product0_.productID as productI1_1_0_, product0_.productName as productN2_1_0_, product0_.orderID as orderID3_1_0_ from t_product product0_ where product0_.productID=?
Product [productID=1, productName=产品1, order=Order [orderID=1, Name=订单一, SumMoney=12.0, createDate=2014-05-02 15:24:02.0]]
-----------Read Order-----------
订单一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void test04_Get() {
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
     
        System.out.println("-----------Read  Product-----------");
        Product product = (Product) session.get(Product.class, 1);
        System.out.println("-----------Print  Product-----------");
        System.out.println(product);
        System.out.println("-----------Read  Order-----------");
        System.out.println(product.getOrder().getName());
 
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (session != null)
            session.close();
    }
}

  输出:

-----------Read Product-----------
Hibernate: select product0_.productID as productI1_1_0_, product0_.productName as productN2_1_0_, product0_.orderID as orderID3_1_0_ from t_product product0_ where product0_.productID=?
-----------Print Product-----------
Hibernate: select order0_.orderID as orderID1_0_0_, order0_.Name as Name2_0_0_, order0_.SumMoney as SumMoney3_0_0_, order0_.createDate as createDa4_0_0_ from t_order order0_ where order0_.orderID=?
Product [productID=1, productName=产品1, order=Order [orderID=1, Name=订单一, SumMoney=12.0, createDate=2014-05-02 15:24:02.0]]
-----------Read Order-----------
订单一

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Test
public void test04_Del() {
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        /*
         
        Product product = (Product) session.get(Product.class, 1);
        session.delete(product);
    输出:
    Hibernate: select product0_.productID as productI1_1_0_, product0_.productName as productN2_1_0_, product0_.orderID as orderID3_1_0_ from t_product product0_ where product0_.productID=?
    Hibernate: delete from t_product where productID=?
    */ 
        Order order = (Order) session.get(Order.class, 3);
        session.delete(order);
         
         
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (session != null)
            session.close();
    }
}

  输出:


Hibernate: select order0_.orderID as orderID1_0_0_, order0_.Name as Name2_0_0_, order0_.SumMoney as SumMoney3_0_0_, order0_.createDate as createDa4_0_0_ from t_order order0_ where order0_.orderID=?
Hibernate: delete from t_order where orderID=?
org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)

 

-------------------------------------------------OneToMany----------------------------------------------------------------------------

>>> OneToMany  单相关联

 

 

2.1   

 需求背景:

   每个人都有很多标签:

在User 类中添加:

 

?
1
2
3
4
5
6
7
public Set getTags() {
    return tags;
}
public void setTags(Set tags) {
    this.tags = tags;
}
private Set tags;

 

  同时 添加 Tag类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.rhythmk.model;
 
public class Tag {
   public Integer getTagId() {
        return tagId;
    }
    public void setTagId(Integer tagId) {
        this.tagId = tagId;
    }
    public String getTagTitle() {
        return tagTitle;
    }
    public void setTagTitle(String tagTitle) {
        this.tagTitle = tagTitle;
    }
    public Integer getUserID() {
        return userID;
    }
    @Override
    public String toString() {
        return "Tag [tagId=" + tagId + ", tagTitle=" + tagTitle + ", userID="
                + userID + "]";
    }
    public void setUserID(Integer userID) {
        this.userID = userID;
    }
private Integer  tagId;
   private String tagTitle;
   private Integer userID;
}

  

 

添加User对应XML配置:

 

soscw.com,搜素材
        set name="tags">
            key column="userID">key>
            
            one-to-many class="com.rhythmk.model.Tag" />
        set>
soscw.com,搜素材

 

注意:此处 one-to-many 对应的 class 需要填写类的全路径名称

2.2  验证:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Test
    public void test01_add() {
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            Tag t1 = new Tag();
            t1.setTagTitle("tag1");
 
            Tag t2 = new Tag();
            t2.setTagTitle("tag2");
 
            Set tags = new HashSet();
            tags.add(t1);
            tags.add(t2);
 
            User entity = new User();
            entity.setUserName("张飞2222");
            entity.setCreateTime(new Date());
 
            entity.setTags(tags);
            session.save(t1);
            session.save(t2);
            session.save(entity);
 
            session.getTransaction().commit();
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (session != null)
                session.close();
        }
    }

  输出:

Hibernate: insert into t_tag (tagTitle) values (?)
Hibernate: insert into t_tag (tagTitle) values (?)
Hibernate: insert into t_user (userName, createTime) values (?, ?)
Hibernate: update t_tag set userID=? where tagId=?
Hibernate: update t_tag set userID=? where tagId=?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
    public void test02_get() {
        Session session = null;
        try {
            


评论


亲,登录后才可以留言!