zoukankan      html  css  js  c++  java
  • hibernate关系映射

    多对一:比如多个订单对应同一个用户,需要在订单表中添加一个用户的属性

    订单类:

    private Integer orderId;
    private Date createTime;
    private User user;

    用户类:

    private int userId;
    private String userName;
    private String userPsw;

    一的方配置xml(user):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="ni.jun.yang.bean.User" table="t_user">
            <id name="userId">
    <!--         主键自动增长 -->
                <generator class="native"></generator>
            </id>        
            <property name="userName"></property>
            <property name="userPsw"></property>
        </class>
    </hibernate-mapping>

    多的一方配置xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="ni.jun.yang.bean.Orders" table="t_order">
            <id name="orderId" column="orderId">
                <generator class="native"></generator>
            </id>
            <property name="createTime" type="date"></property>
            
            <!-- 多个订单对应一个用户,配置多对一的映射    cascade级联-->
            <many-to-one name="user" class="ni.jun.yang.bean.User" column="userId"  cascade="all">
            </many-to-one>
        </class>
    </hibernate-mapping>
     <many-to-one name="user" class="ni.jun.yang.bean.User" column="userId"  cascade="all">  
    name:类中的成员变量名字
    class:对应类的全路径,配了包名只需要写类名即可
    column:数据库里面的字段名字
    cascade:级联 其值有“all”,“save-update”,“delete”等

    测试代码:由于配置级联 cascade=‘all’,保存订单会首先自动保存级联的用户对象
    Session session =  HibernateUtil.getSessionFactory().openSession();
            Transaction ts = session.beginTransaction();
            User user = new User();
            user.setUserName("不知3");
            user.setUserPsw("4563");
            
            Orders orders1 =new Orders();
            orders1.setCreateTime(new Date());
            orders1.setUser(user);
            
            session.save(orders1);
            ts.commit();
            session.close();

    一对多:比如一个人可以有多张银行卡

    一的一方需要设置一个 集合来存放多的一方 使用list 或者set集合,一般多用set集合

    如:一个人有多个地址,list集合存放

    private List<String> addresses;

    xml配置:list用list标签,要配置索引 list-index

    <list name="addresses" table="address">
                <key column="customerId"></key>
                <!-- 用list需要配list索引,相当于下标从0开始 -->
                <list-index column="ListIndex"></list-index>
                <element type="string" column="addressName"></element>
            </list>

    set集合存放:

    private Set<String> addresses;

    xml配置:set用set标签

    <set name="addresses" table="address" sort="natural">
                <key column="customerId"></key>
                <element type="string" column="addressName"></element>
            </set>

    双向一对多:如一个人有多套房,他就有多个地址

    customer:

    private Integer customerId;
        private String customerName;
        private Set<Address> adresses;

    address:

    private Customer customer;
        private Integer addressId;
        private String address;

    customer  xml配置:

    <!-- inverse=true 放弃关联关系维护,默认false,关系维护-->
            <set name="adresses" table="_Address" inverse="true" cascade="save-update">
                <key column="customerId"></key>
            <one-to-many class="ni.jun.yang.bean.Address" />
            </set>

    address  xml配置

    <many-to-one name="customer" class="Customer" column="customerId"></many-to-one>

    测试代码:

    Session session =  HibernateUtil.getSessionFactory().openSession();
            Transaction ts = session.beginTransaction();
            Address address1 = new Address();
            address1.setAddress("青羊区");
            Address address2 = new Address();
            address2.setAddress("武侯区");
            Set<Address> set = new HashSet<Address>();
            set.add(address1);
            set.add(address2);
            
            Customer customer = new Customer();
            customer.setCustomerName("zhubajie");
            customer.setAdresses(set);
            session.save(customer);                
            ts.commit();
            session.close();

    多对多,需要第三张表来建立关联关系,必须有一方放弃关联关系维护

    类里面两边互相有对方作为成员变量

    items:

    private Set<Orders> orders=new HashSet<Orders>();

    orders:

    private Set<Items> items = new HashSet<>();

    xml配置里面要设置第三张表来关联:orders_r_items  第三张表

    items xml:

    <set name="orders" table="orders_r_items">
                <key column="itemsId"></key>
                <many-to-many class="Orders" column="orderId"></many-to-many>
            </set>

    orders xml:

    <!-- items的集合 多对多,必须有一方放弃关联关系维护 -->
            <set name="items" table="orders_r_items" inverse="true">
                <key column="orderId"></key>
                <many-to-many class="Items"  column="itemsId"></many-to-many>
            </set>

    测试代码:

    Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
                    
            Items item = new Items();
            item.setPrice(new Double(100));        
            Items item1 = new Items();
            item1.setPrice(new Double(200));
                    
            Orders o = new Orders();
            o.setCreateTime(new Date());
            Orders o1 = new Orders();
            o1.setCreateTime(new Date());
            
            o.getItems().add(item);
            o.getItems().add(item1);
    
            o1.getItems().add(item);
            o1.getItems().add(item1);
            
            item.getOrders().add(o);
            item.getOrders().add(o1);
            
            item1.getOrders().add(o);
            item1.getOrders().add(o1);
            
            session.save(item);
            session.save(item1);
            
            session.save(o);
            session.save(o1);
                    
            tx.commit();    
            session.close();
  • 相关阅读:
    Java-技术专区-JVM调优常用参数
    Alibaba-技术专区-Dubbo的SPI应用与原理
    Java-技术专区-深入理解SPI机制
    Alibaba-技术专区-Dubbo SPI扩展点加载机制
    Java-技术专区-线程基础
    Java-技术专区-精巧好用的DelayQueue
    Alibaba-技术专区-Sentinel流量降级监控
    Java-技术专区-Java线程池ThreadPoolExecutor的理解
    SpringCloud-技术专区-SpringCloud组件原理
    机器码和伪指令
  • 原文地址:https://www.cnblogs.com/nijunyang/p/7666243.html
Copyright © 2011-2022 走看看