zoukankan      html  css  js  c++  java
  • Hibernate--对象关系

    在hibernate中,关联关系映射分为单向关联和双向关联。共有七种关系

      ·@Many To One

      ·@One To Many(单向

      ·@One To Many(多向)

      ·@One To One(单向)

      ·@One To One(多向)

      ·@Many To Many(单向)

      ·@Many To Many(多向)

      hibernate在维护这几种关系的时候,要不通过连接表,要不通过外键的方式。

    @Many To One

      这是一种最常见的关系,hibernate是通过在many的一方加入one的一个主键作为外键的方式来管理关系的。

      此时的多的一方和一的一方,需要各自管理,分别保存,也可以在many-to-one的配置中加入级联属性,则在保存多的一端的时候,会自动保存一的一端

    先看配置文件版

    package com.fuwh.model;
    //one
    public class Father {
    
        private int id;
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.model;
    //Many
    public class Child {
        
        private int id;
        private String name;
        //在many的一端中加入one作为一个属性变量
        private Father father;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Father getFather() {
            return father;
        }
    
        public void setFather(Father father) {
            this.father = father;
        }
        
    }
    <?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 package="com.fuwh.model">
        
        <class name="Father" table="t_father">
            <id name="id" column="fatherId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="fatherName"></property>
        </class>
    
    </hibernate-mapping>

    
    
    <?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 package="com.fuwh.model">
        <class name="Child" table="t_child">
            <id name="id" column="childId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="childName"></property>
            <!-- 
                单向多(child)对一(father)的关系
                会在多(child)的一方生成的表中添加一个外键,指向一(father)的主键
                需要在多(child)的一方配置many-to-one
                name:指定类中的Father对象变量
                column:指定外键名字
           cascade:表示级联操作,包含以下集中取值 none(默认),all,persist, merge, delete, save-update, evict, replicate,lock and refresh,delete-orphan ; 可以用逗号隔开,表示几个取值,all代表所有的
    -->
    <many-to-one name="father" column="father_Id" cascade="all"></many-to-one> </class> </hibernate-mapping>
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
    <hibernate-configuration>
        
        <session-factory>
            <!-- 数据库连接设置 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">mysqladmin</property>
            <!--
                 指定方言,表明用的是哪种数据库,也可以不指定,hibernate默认会翻译成正确的数据库脚本
                方言可以在 hibernate-release-xx.xx/project/etc/hibernate.properties 中查找
             -->
            <property name="hibernate.dialect">MySQL5</property>
            <!-- 设定时候更新表结构,不存在或自动创建 -->
            <property name="hibernate.hbm2ddl.auto">update</property>
            <!-- 配置 在后台打印出sql语句 -->
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
           <!-- 引入实体类和表的映射文件 -->
            <mapping resource="/com/fuwh/model/Father.hbm.xml"/>
            <mapping resource="/com/fuwh/model/Child.hbm.xml"/>
            
        </session-factory>
        
    </hibernate-configuration>
    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
    
            
            session.getTransaction().commit();
            session.close();
        }
        
        
    
    }

    执行空的测试语句,生成的sql文如下

    Hibernate: 
        
        create table t_child (
           childId integer not null auto_increment,
            childName varchar(255),
            father_Id integer,
            primary key (childId)
        )
    Hibernate: 
        
        create table t_father (
           fatherId integer not null auto_increment,
            fatherName varchar(255),
            primary key (fatherId)
        )
    Hibernate: 
        
        alter table t_child 
           add constraint FKg4qwua9ltkkkfik7fsvubyou7 
           foreign key (father_Id) 
           references t_father (fatherId)

    操作表中的数据

     

    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.model.Child;
    import com.fuwh.model.Father;
    
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father=new Father();
            father.setName("爸爸");
            //因为在多的一断配置了级联属性为all,就表明把操作都交给了多的一端来维护关系,不需要保存father对象
            //在保存child的时候,会自动保存father
            
            Child child1=new Child();
            child1.setName("儿子1");
            child1.setFather(father);
    
            Child child2=new Child();
            child2.setName("儿子2");
            child2.setFather(father);
            
            session.save(child1);
            session.save(child2);
    
            session.getTransaction().commit();
            session.close();
        }
    }

    生成的sql文

    Hibernate: 
        insert 
        into
            t_father
            (fatherName) 
        values
            (?)
    Hibernate: 
        insert 
        into
            t_child
            (childName, father_Id) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            t_child
            (childName, father_Id) 
        values
            (?, ?)

    注解版 

    package com.fuwh.mto;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Father {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="fatherName")
        private String name;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.mto;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.ForeignKey;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Child {
    
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="childName")
        private String name;
        
        /**
         * 定义多对一
         * JoinCloumn中的name指定外键的列名,foreignkey中指定定义的外键的名字
         * 这一列也可以不加,不加就是默认的设置
         */
        @ManyToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="father_id",foreignKey=@ForeignKey(name="FATHER_ID_FK"))
        private Father father;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Father getFather() {
            return father;
        }
        public void setFather(Father father) {
            this.father = father;
        }
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.mto.Child;
    import com.fuwh.mto.Father;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father=new Father();
            father.setName("爸爸");
            
            Child child1=new Child();
            child1.setName("儿子一");
            child1.setFather(father);
            Child child2=new Child();
            child2.setName("儿子二");
            child2.setFather(father);
            
            session.save(child1);
            session.save(child2);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    @One To Many单向

      @One To Many关系把一个父节点和多个子节点联系起来,如果在子节点没有一个@Many To One和@One To Many相匹配的话,那就是一个单向的@One To Many,否则的话就是一个多向的@One To Many,并且可以在任意一边来维护关系。

    package com.fuwh.model;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Father {
    
        private int id;
        private String name;
        
        private List<Child> children=new ArrayList<Child>();
        
        public List<Child> getChildren() {
            return children;
        }
        public void setChildren(List<Child> children) {
            this.children = children;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.model;
    
    public class Child {
        
        private int id;
        private String name;
        
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    }
    <?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 package="com.fuwh.model">
        <class name="Child" table="t_child">
            <id name="id" column="childId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="childName"></property>
        </class>
    
    </hibernate-mapping>
    <?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 package="com.fuwh.model">
        
        <class name="Father" table="t_father">
            <id name="id" column="fatherId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="fatherName"></property>
            <set name="children" cascade="true">
                <key column="father_Id"></key>
                <one-to-many class="com.fuwh.model.Child"/>
            </set>
        </class>
    
    </hibernate-mapping>
    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    生成的sql文

    Hibernate: 
        
        create table t_child (
           childId integer not null auto_increment,
            childName varchar(255),
         father_Id integer,
    primary key (childId) ) Hibernate: create table t_father ( fatherId integer not null auto_increment, fatherName varchar(255), primary key (fatherId) ) Hibernate: alter table t_child add constraint FKev9uk6ojrjsv10ba9qoa4yhsy foreign key (father_Id) references t_father (fatherId)

    注解版 

    package com.fuwh.otm;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Child {
    
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="childName")
        private String name;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.otm;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Father {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="fatherName")
        private String name;
        
        //orphanRemoval:表示在删除集合中的child的时候,也会删除child表中的相应纪录
        @OneToMany(cascade=CascadeType.ALL,orphanRemoval=true)
        private List<Child> children=new ArrayList<Child>(); 
        
        public List<Child> getChildren() {
            return children;
        }
        public void setChildren(List<Child> children) {
            this.children = children;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.otm.Child;
    import com.fuwh.otm.Father;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father1=new Father();
            father1.setName("爸爸1");
            Father father2=new Father();
            father2.setName("爸爸2");
            Child child1=new Child();
            child1.setName("儿子一");
            Child child2=new Child();
            child2.setName("儿子二");
            
            father1.getChildren().add(child1);
            father1.getChildren().add(child2);
            
            session.save(father1);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    @One To Many双

    package com.fuwh.model;
    
    public class Child {
        
        private int id;
        private String name;
        private Father father;
        
        public Father getFather() {
            return father;
        }
    
        public void setFather(Father father) {
            this.father = father;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.model;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Father {
    
        private int id;
        private String name;
        
        private Set<Child> children=new HashSet<Child>();
        
        public Set<Child> getChildren() {
            return children;
        }
        public void setChildren(Set<Child> children) {
            this.children = children;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    <?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 package="com.fuwh.model">
        
        <class name="Father" table="t_father">
            <id name="id" column="fatherId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="fatherName"></property>
            <set name="children">
                <key column="father_Id"/>
                <one-to-many class="com.fuwh.model.Child"/>
            </set>
        </class>
    
    </hibernate-mapping>
    <?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 package="com.fuwh.model">
        <class name="Child" table="t_child">
            <id name="id" column="childId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="childName"></property>
            <many-to-one name="father" column="father_Id" cascade="all"></many-to-one>
        </class>
    
    </hibernate-mapping>
    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.model.Child;
    import com.fuwh.model.Father;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father=new Father();
            father.setName("爸爸");
            Child child1=new Child();
            child1.setName("儿子1");
            Child child2=new Child();
            child2.setName("儿子2");
            
            child1.setFather(father);
            child2.setFather(father);
            
            father.getChildren().add(child1);
            father.getChildren().add(child2);
            
            session.save(child1);
            session.save(child2);
        
            session.getTransaction().commit();
            session.close();
            
        }
    }

    生成的sql

    Hibernate: 
        select
            father0_.fatherId as fatherId1_1_0_,
            father0_.fatherName as fatherNa2_1_0_ 
        from
            t_father father0_ 
        where
            father0_.fatherId=?
    Hibernate: 
        select
            child0_.childId as childId1_0_0_,
            child0_.childName as childNam2_0_0_,
            child0_.father_Id as father_I3_0_0_ 
        from
            t_child child0_ 
        where
            child0_.childId=?
    Hibernate: 
        select
            children0_.father_Id as father_I3_0_0_,
            children0_.childId as childId1_0_0_,
            children0_.childId as childId1_0_1_,
            children0_.childName as childNam2_0_1_,
            children0_.father_Id as father_I3_0_1_ 
        from
            t_child children0_ 
        where
            children0_.father_Id=?
    Hibernate: 
        update
            t_child 
        set
            childName=?,
            father_Id=? 
        where
            childId=?
    Hibernate: 
        update
            t_child 
        set
            father_Id=? 
        where
            childId=?

    注解版 

    package com.fuwh.otmbi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Father {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="fatherName")
        private String name;
        
        /**
         * orphanRemoval:表示在删除集合中的child的时候,也会删除child表中的相应纪录
         * mappedBy/inverse:表示由另一方来维护关系
         * 
         */
        @OneToMany(mappedBy="father",cascade=CascadeType.ALL,orphanRemoval=true)
        
        private List<Child> children=new ArrayList<Child>(); 
        
        public List<Child> getChildren() {
            return children;
        }
        public void setChildren(List<Child> children) {
            this.children = children;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.otmbi;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToOne;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Child {
    
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="childName")
        private String name;
        
        @ManyToOne
        private Father father;
        
        public Father getFather() {
            return father;
        }
        public void setFather(Father father) {
            this.father = father;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.otmbi.Child;
    import com.fuwh.otmbi.Father;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father1=new Father();
            father1.setName("爸爸1");
            Child child1=new Child();
            child1.setName("儿子一");
            child1.setFather(father1);
            Child child2=new Child();
            child2.setName("儿子二");
            child2.setFather(father1);
            
            father1.getChildren().add(child1);
            father1.getChildren().add(child2);
            
            session.save(father1);
            session.getTransaction().commit();
            session.close();
            
        }
    }

    @One To One单向

      单向的关系又可以分为基于主键的关联和基于外键的关联。

    基于外键

    package com.fuwh.model;
    
    public class Wife {
    
        private int id;
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.model;
    
    public class Husband {
    
        private int id;
        private String name;
        
        private Wife wife;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Wife getWife() {
            return wife;
        }
    
        public void setWife(Wife wife) {
            this.wife = wife;
        }
        
    }
    <?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 package="com.fuwh.model">
        
        <class name="Wife" table="t_wife">
            <id name="id" column="wifeId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="wifeName"></property>
    
    
        </class>
    
    </hibernate-mapping>
    <?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 package="com.fuwh.model">
        <class name="Husband" table="t_husband">
            <id name="id" column="husbandId">
                <!-- 主键生成策略为 外键 指向 wife-->
                <generator class="foreign">
                    <param name="property">wife</param>
                </generator>
            </id>
            <property name="name" column="husbandName"></property>
            <one-to-one name="wife" constrained="true"/>
        </class>
    
    </hibernate-mapping>
    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.model.Child;
    import com.fuwh.model.Father;
    import com.fuwh.model.Husband;
    import com.fuwh.model.Wife;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Husband husband=new Husband();
            Wife wife=new Wife();
            wife.setName("老婆");
            
            husband.setName("老公");
            husband.setWife(wife);
            
            session.save(wife);
            session.save(husband);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    生成的sql文

    Hibernate: 
        
        create table t_husband (
           husbandId integer not null,
            husbandName varchar(255),
            primary key (husbandId)
        )
    Hibernate: 
        
        create table t_wife (
           wifeId integer not null auto_increment,
            wifeName varchar(255),
            primary key (wifeId)
        )
    Hibernate: 
        
        alter table t_husband 
           add constraint FK2tae450lphjy8nciwyrxxlfkv 
           foreign key (husbandId) 
           references t_wife (wifeId)
    Hibernate: 
        insert 
        into
            t_wife
            (wifeName) 
        values
            (?)
    Hibernate: 
        insert 
        into
            t_husband
            (husbandName, husbandId) 
        values
            (?, ?)

    在单向一对一中,hibernate默认是让client-side(上例的Husband)通过外键来管理关系的。

    注解版

    package com.fuwh.oto;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Father {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="fatherName")
        private String name;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.oto;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Child {
    
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="childName")
        private String name;
        
        @OneToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="father_id")
        private Father father;
        
        
        public Father getFather() {
            return father;
        }
        public void setFather(Father father) {
            this.father = father;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.oto.Child;
    import com.fuwh.oto.Father;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father1=new Father();
            father1.setName("爸爸1");
            Child child1=new Child();
            child1.setName("儿子一");
            child1.setFather(father1);
            
            session.save(child1);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

     @One-To-One(双向)

    package com.fuwh.model;
    
    public class Wife {
    
        private int id;
        private String name;
        private Husband husband;
        
        public Husband getHusband() {
            return husband;
        }
        public void setHusband(Husband husband) {
            this.husband = husband;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    <?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 package="com.fuwh.model">
        
        <class name="Wife" table="t_wife">
            <id name="id" column="wifeId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="wifeName"></property>
            <one-to-one name="husband"/>
    
        </class>
    
    </hibernate-mapping>
    Hibernate: 
        
        create table t_husband (
           husbandId integer not null,
            husbandName varchar(255),
            primary key (husbandId)
        )
    Hibernate: 
        
        create table t_wife (
           wifeId integer not null auto_increment,
            wifeName varchar(255),
            primary key (wifeId)
        )
    Hibernate: 
        
        alter table t_husband 
           add constraint FK2tae450lphjy8nciwyrxxlfkv 
           foreign key (husbandId) 
           references t_wife (wifeId)
    Hibernate: 
        insert 
        into
            t_wife
            (wifeName) 
        values
            (?)
    Hibernate: 
        insert 
        into
            t_husband
            (husbandName, husbandId) 
        values
            (?, ?)

    注解版

    package com.fuwh.otobi;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Father {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="fatherName")
        private String name;
        
        @OneToOne(mappedBy="father",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
        private Child child;
        
        public Child getChild() {
            return child;
        }
        public void setChild(Child child) {
            this.child = child;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    package com.fuwh.otobi;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    public class Child {
    
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        
        @Column(name="childName")
        private String name;
        
        @OneToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="father_id")
        private Father father;
        
        
        public Father getFather() {
            return father;
        }
        public void setFather(Father father) {
            this.father = father;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.otobi.Child;
    import com.fuwh.otobi.Father;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Father father1=new Father();
            father1.setName("爸爸1");
            Child child1=new Child();
            child1.setName("儿子一");
            child1.setFather(father1);
            
            session.save(child1);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    @Many-To-Many(单向)

       @Many-To-Many关系需要一个连接表来连接两张表。

    package com.fuwh.model;
    
    public class Wife {
    
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    package com.fuwh.model;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Husband {
    
        private int id;
        private String name;
        private Set<Wife> wives=new HashSet<Wife>();
        
        public Set<Wife> getWives() {
            return wives;
        }
    
        public void setWives(Set<Wife> wives) {
            this.wives = wives;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        
    }
    <?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 package="com.fuwh.model">
        
        <class name="Wife" table="t_wife">
            <id name="id" column="wifeId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="wifeName"></property>
    
        </class>
    
    </hibernate-mapping>
    <?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 package="com.fuwh.model">
        <class name="Husband" table="t_husband">
            <id name="id" column="husbandId">
                <generator class="native"/>
            </id>
            <property name="name" column="husbandName"></property>
            <set name="wives" cascade="all">
                <!-- key 指定连接表的主键列 
                    many-to-many:中的列指定连接另一端的列,或对应的类
                 -->
                <key column="husband_id"></key>
                <many-to-many column="wife_id" class="com.fuwh.model.Wife"></many-to-many>
            </set>
        </class>
    
    </hibernate-mapping>
    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.model.Child;
    import com.fuwh.model.Father;
    import com.fuwh.model.Husband;
    import com.fuwh.model.Wife;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Husband husband=new Husband();
            husband.setName("老公");
            
            Wife wife1=new Wife();
            wife1.setName("老婆1");
            Wife wife2=new Wife();
            wife2.setName("老婆2");
            
            husband.getWives().add(wife1);
            husband.getWives().add(wife2);
    //        session.save(wife);
            session.save(husband);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    注解

     

    package com.fuwh.model;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity(name="person")
    public class Person {
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        @ManyToMany(cascade=CascadeType.ALL)
        private List<Address> addresses=new ArrayList<Address>();
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public List<Address> getAddresses() {
            return addresses;
        }
        public void setAddresses(List<Address> addresses) {
            this.addresses = addresses;
        }
        
    }
    package com.fuwh.model;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity(name="address")
    public class Address {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        @Column(name="street")
        private String street;
        private String number;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getStreet() {
            return street;
        }
        public void setStreet(String street) {
            this.street = street;
        }
        public String getNumber() {
            return number;
        }
        public void setNumber(String number) {
            this.number = number;
        }
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.model.Address;
    import com.fuwh.model.Person;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Person person=new Person();
            
            Address address1=new Address();
            address1.setNumber("1001");
            address1.setStreet("java路");
            
            Address address2=new Address();
            address2.setNumber("1002");
            address2.setStreet("php路");
            
            person.getAddresses().add(address1);
            person.getAddresses().add(address2);
            
            session.save(person);
            
            session.flush();
            //删除的时候会把所有的address的id的记录删除,在插入其他不用删除的
            person.getAddresses().remove(address1);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    生成的SQL文

    Hibernate: 
        
        create table address (
           id integer not null auto_increment,
            number varchar(255),
            street varchar(255),
            primary key (id)
        )
    Hibernate: 
        
        create table person (
           id integer not null auto_increment,
            primary key (id)
        )
    Hibernate: 
        
        create table person_address (
           person_id integer not null,
            addresses_id integer not null
        )
    Hibernate: 
        
        alter table person_address 
           add constraint FKkvjdfs4jhjpxa6y3melormp0w 
           foreign key (addresses_id) 
           references address (id)
    Hibernate: 
        
        alter table person_address 
           add constraint FKnndfs0btabect8upo03uwgfxt 
           foreign key (person_id) 
           references person (id)
    Hibernate: 
        insert 
        into
            person
            
        values
            ( )
    Hibernate: 
        insert 
        into
            address
            (number, street) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            address
            (number, street) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            person_address
            (person_id, addresses_id) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            person_address
            (person_id, addresses_id) 
        values
            (?, ?)
    Hibernate: 
        delete 
        from
            person_address 
        where
            person_id=?
    Hibernate: 
        insert 
        into
            person_address
            (person_id, addresses_id) 
        values
            (?, ?)

      @Many-To-Many(双向)

    package com.fuwh.model;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Wife {
    
        private int id;
        private String name;
        private Set<Husband> husbands=new HashSet<Husband>();
        
        public Set<Husband> getHusbands() {
            return husbands;
        }
        public void setHusbands(Set<Husband> husbands) {
            this.husbands = husbands;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    <?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 package="com.fuwh.model">
        
        <class name="Wife" table="t_wife">
            <id name="id" column="wifeId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="wifeName"></property>
            <!-- 这里必须参照Husband.hbm.xml文件中的连接表的配置,否则会默认生成两个连接表
                也就是两个单向的多对多    
             -->
            <set name="husbands" inverse="true" table="husband_wife">
                <key column="wife_id"></key>
                <many-to-many column="husband_id" class="com.fuwh.model.Husband" ></many-to-many>
            </set>
        </class>
    
    </hibernate-mapping>
    package com.fuwh.service;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.model.Child;
    import com.fuwh.model.Father;
    import com.fuwh.model.Husband;
    import com.fuwh.model.Wife;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Husband husband1=new Husband();
            husband1.setName("老公1");
            Husband husband2=new Husband();
            husband2.setName("老公2");
            
            Wife wife1=new Wife();
            wife1.setName("老婆1");
            Wife wife2=new Wife();
            wife2.setName("老婆2");
            
            husband1.getWives().add(wife1);
            husband1.getWives().add(wife2);
            wife1.getHusbands().add(husband1);
            wife1.getHusbands().add(husband2);
            
            session.save(husband1);
            session.save(husband2);
            
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

     生成的SQL文

    Hibernate: 
        
        create table husband_wife (
           husband_id integer not null,
            wife_id integer not null,
            primary key (husband_id, wife_id)
        )
    Hibernate: 
        
        create table t_husband (
           husbandId integer not null auto_increment,
            husbandName varchar(255),
            primary key (husbandId)
        )
    Hibernate: 
        
        create table t_wife (
           wifeId integer not null auto_increment,
            wifeName varchar(255),
            primary key (wifeId)
        )
    Hibernate: 
        
        alter table husband_wife 
           add constraint FK56txr9ocpn1k0eyc7ax1a2smw 
           foreign key (wife_id) 
           references t_wife (wifeId)
    Hibernate: 
        
        alter table husband_wife 
           add constraint FKsiwjiutn6eoha0iv059pd75fc 
           foreign key (husband_id) 
           references t_husband (husbandId)
    Hibernate: 
        insert 
        into
            t_husband
            (husbandName) 
        values
            (?)
    Hibernate: 
        insert 
        into
            t_wife
            (wifeName) 
        values
            (?)
    Hibernate: 
        insert 
        into
            t_husband
            (husbandName) 
        values
            (?)
    Hibernate: 
        insert 
        into
            t_wife
            (wifeName) 
        values
            (?)
    
    Hibernate: 
        insert 
        into
            husband_wife
            (husband_id, wife_id) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            husband_wife
            (husband_id, wife_id) 
        values
            (?, ?)

    注解

     

    package com.fuwh.mtmbi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity(name="person")
    public class Person {
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        @ManyToMany(cascade=CascadeType.ALL)
        private List<Address> addresses=new ArrayList<Address>();
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public List<Address> getAddresses() {
            return addresses;
        }
        public void setAddresses(List<Address> addresses) {
            this.addresses = addresses;
        }
        
    }
    package com.fuwh.mtmbi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity(name="address")
    public class Address {
        
        @Id
        @GeneratedValue(generator="_native")
        @GenericGenerator(name="_native",strategy="native")
        private int id;
        @Column(name="street")
        private String street;
        private String number;
        @ManyToMany(mappedBy="address")
        private List<Person> owners=new ArrayList<Person>();
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getStreet() {
            return street;
        }
        public void setStreet(String street) {
            this.street = street;
        }
        public String getNumber() {
            return number;
        }
        public void setNumber(String number) {
            this.number = number;
        }
        
    }
    package com.fuwh.service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fuwh.mtmbi.Person;
    import com.fuwh.mtmbi.Address;
    
    public class DoTest {
        
        //标准的sessionFactory取得方式
        private SessionFactory sessionFactory;
        
        @Before
        public void setUp() throws Exception {
            final StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
            try {
                sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    
        @After
        public void tearDown() throws Exception {
            if(sessionFactory != null){
                sessionFactory.close();
            }
        }
    
        @Test
        public void testAdd() {
            Session session=sessionFactory.openSession();
            session.beginTransaction();
            
            Person person1=new Person();
            Person person2=new Person();
            Address address1=new Address();
            address1.setNumber("101");
            Address address2=new Address();
            address2.setNumber("102");
            person1.getAddresses().add(address1);
            person1.getAddresses().add(address2);
            
            person2.getAddresses().add(address1);
            session.save(person1);
            session.save(person2);
            
            session.getTransaction().commit();
            session.close();
            
        }
    }

    生成的SQL文

    Hibernate: 
        
        create table address (
           id integer not null auto_increment,
            number varchar(255),
            street varchar(255),
            primary key (id)
        )
    Hibernate: 
        
        create table person (
           id integer not null auto_increment,
            primary key (id)
        )
    Hibernate: 
        
        create table person_address (
           owners_id integer not null,
            addresses_id integer not null
        )
    Hibernate: 
        
        alter table person_address 
           add constraint FKkvjdfs4jhjpxa6y3melormp0w 
           foreign key (addresses_id) 
           references address (id)
    Hibernate: 
        
        alter table person_address 
           add constraint FKpts56mn8uttsyi3b63b2cihvo 
           foreign key (owners_id) 
           references person (id)
    Hibernate: 
        insert 
        into
            person
            
        values
            ( )
    Hibernate: 
        insert 
        into
            address
            (number, street) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            address
            (number, street) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            person
            
        values
            ( )
    Hibernate: 
        insert 
        into
            person_address
            (owners_id, addresses_id) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            person_address
            (owners_id, addresses_id) 
        values
            (?, ?)
    Hibernate: 
        insert 
        into
            person_address
            (owners_id, addresses_id) 
        values
            (?, ?)
  • 相关阅读:
    spring三大框架整合
    spring基础内容
    安装Apache报80端口被占用 pid 4
    Bugzilla说明
    管理员权限的用户
    mac怎么连接windows远程桌面
    java化测试神器-流量回放平台
    PyAutoGUI——图形用户界面自动化
    (Python OpenGL)【5】平移 PyOpenGL
    (Python OpenGL)【4】Uniform变量 PyOpenGL
  • 原文地址:https://www.cnblogs.com/zerotomax/p/6361633.html
Copyright © 2011-2022 走看看