hibernate之映射關係一對多

前序:一對多:是相對於一的一方看多一面,一的一方存放多方的多個對象,存儲方式用集合存放
   對於配置有兩個問題需要弄清楚:
    0、本文中的兩個實體類
      UserClass.java:一個UserClass對象多個User對象
      User.java :一個User對像對應一個UserClass或不對應
      
    1、配置的各個屬性:
      UserClass.bhm.xml的集合配置:
      
       name="users":指定UserClass對象中存放多個User對象集合的名稱
       table="t_user":指定User對象所對應的表名稱
       cascade=“all”:表示級聯操作當前集合中的對象,如果存在update、不存在save、
       column="uc_id":指定當前指向多個User對象的外鍵字段
       class="com.wolf.pojo.oneToone.UserT":指向多的個對象的User類
        <set name="users" table="t_user" cascade="all" >
             <key column="uc_id"></key>
             <one-to-many class="com.wolf.pojo.oneToone.UserT"/>
            </set>
          User.bhm.xml的集合配置:
            其中兩個就不介紹了
            column="u_uc_id":指定當前(本表或本類)外鍵的字段
        <many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass"  column="u_uc_id" ></many-to-one>
       
     注意:<key column="u_uc_id"></key>和<many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass"  column="u_uc_id" ></many-to-one>
        指向的都是多的一端字段(一對多)
    2、運行的詳細說明
      1、如果程序一的一端,使用Set集合保存數據,如果繼續添加數據只需獲得集合直接add方法添加
          UserClass usercls=new UserClass();
          usercls.setId(UUID.randomUUID().toString());
          UserT user=new UserT();
          user.setId(UUID.randomUUID().toString());
          user.setName("user0");
          user.setAge(0);
          user.setPrice(0.1);
          user.setDatet(new Date());
          user.setUserclass(usercls);
          
          usercls.getUsers().add(user);//添加數據
      2、如果程序一的一端,使用Set集合保存數據,並且繼續添加數據需要注意的一個地方,就是不能直接new Set集合否則,會將以前的數據刷掉(不代表刪除,應用字段爲null)
        UserClass usercls=(UserClass) session.get(UserClass.class, "2240f0af-7dc6-4701-ba22-9b3cbaf0b827");
        usercls.setUsers(new HashSet<UserT>());
        
      注意:如果繼續添加採用1的方法,如果想從新添加可以使用2的方法,但是第二種方法會產生垃圾數據在數據庫中(需定時刪除爲null的引用數據),
      
  代碼:
   1、創建表:
   create table t_user(
     u_id varchar(255),
     u_name varchar(255),
     u_age Integer,
     u_price double(5,2),
     u_uc_id varchar(255),
     t_datet datetime,
     primary key(u_id)
    );
    
    create table t_user_class(
     uc_id varchar(255),
     uc_classNo Integer,
     uc_funds double(5,2),
     uc_back varchar(255),
     primary key(uc_id)
    );
   2、配置文件:
   UserClass.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.wolf.pojo.oneToone">
        <class name="UserClass" table="t_user_class">
            <id name="id" column="uc_id"/>
            <property name="classNo" column="uc_classNo"/>
            <property name="funds" column="uc_funds"/>
            <property name="back" column="uc_back"/>
            <!-- inverse="true":關係維護由UserClass負責維護 -->
            <set name="users" table="t_user" cascade="all" >
             <key column="u_uc_id"></key>
             <one-to-many class="com.wolf.pojo.oneToone.UserT"/>
            </set>
        </class>
    </hibernate-mapping>
    
    User.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.wolf.pojo.oneToone" auto-import="false">
        <class name="UserT" table="t_user">
        <!-- 多對一:只有單項    -->
            <id name="id" column="u_id">
            </id>
            <property name="name" column="u_name"/>
            <property name="datet" column="t_datet"/>
            <property name="age" column="u_age"/>
            <property name="price" column="u_price"/>
            <many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass"  column="u_uc_id" ></many-to-one>
        </class>
    </hibernate-mapping>
   3、java類
    
    public class UserClass   implements Serializable{
     
     private  String id;
     private Integer classNo;
     private double funds;
     private String back;
     private Set<UserT> users=new HashSet<UserT>();
     此處略去get、set方法
    }
    
    public class UserT  implements Serializable{
    private String id;
    public String name;
    private Integer age;
    private double price;
    private Date datet;
    private UserClass userclass;
    
    此處略去get、set方法
    }
    
 4、測試代碼:
     public class UtilMain {
    
     public static void main(String[] args) {
     
     Session session= HibernateSessionFactory.getSession();
     Transaction tr=session.beginTransaction();
     
   // UserClass usercls=(UserClass) session.get(UserClass.class, "2240f0af-7dc6-4701-ba22-9b3cbaf0b827");
   // usercls.setUsers(new HashSet<UserT>());
     
     UserClass usercls=new UserClass();
     usercls.setId(UUID.randomUUID().toString());
     UserT user=new UserT();
     user.setId(UUID.randomUUID().toString());
     user.setName("user0");
     user.setAge(0);
     user.setPrice(0.1);
     user.setDatet(new Date());
     user.setUserclass(usercls);
     usercls.getUsers().add(user);
     
     session.saveOrUpdate(usercls);
     tr.commit();
    }
   
   }
   
   
   
   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章