在Hibernate中,@OneToMany单/双向外键关联

来源:互联网 发布:c语言多线程并行案例 编辑:程序博客网 时间:2024/06/18 06:09

一对多单/双向外键关联:指一方持有多方的集合。比如说一个屌丝拥有多个美女。

(一)@OneToMany支持的属性

属性                   说明cascade:1.CascadeType.All:将所有持久化操作级联到关联使用         2.CascadeType.MERGE:将merge操作级联到关联实体         3.CascadeType.PERSIST:将persist操作级联到关联实体         4.CascadeType.REFRESH:将refresh操作级联到关联实体         5.CascadeType.REMOVE:将remove操作级联到关联实体fetch:   1.FetchType.EAGER:立即抓取关联实体         2.FetchType.LAZY:延迟抓取关联实体,需要它时再去抓取。orphanRemovel  1.设置是否删除“孤儿”实体  mappyBy  1.该属性指定关联实体中的哪个属性可以引用到当前实体。targetEntity 1.该属性指定关联实体的类名,通过反射获得关联实体类名

1.一对多单向外键关联
代码如下:

package cn.codeWang.entity;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;@Entity(name = "Person")public class Person {    @Id    @GeneratedValue    @Column(name = "person_id")    private Long id;    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)    private List<Phone> phones = new ArrayList<>();    public Person() {    }    public List<Phone> getPhones() {        return phones;    }}package cn.codeWang.entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity(name = "Phone")public class Phone {    @Id    @GeneratedValue    private Long id;    @Column(name = "`number`")    private String number;    public Phone() {    }    public Phone(String number) {        this.number = number;    }    public Long getId() {        return id;    }    public String getNumber() {        return number;    }}

2.配置文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <!-- 配置连接数据库 -->        <property name="connection.username">root</property>        <property name="connection.password">root</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>        <!-- 配置方言是非常重要!!!我这里配置的为MySQL5Dialect -->        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>        <!-- 配置C3P0连接池 -->        <property name="hibernate.c3p0.max_size">200</property>        <property name="hibernate.c3p0.min_size">2</property>        <property name="hibernate.c3p0.max_statements">50</property>        <property name="hibernate.c3p0.timeout"></property>        <property name="show_sql">true</property>        <property name="format_sql">true</property>        <property name="hbm2ddl.auto">update</property>        <!-- 配置映射文件 -->       <!-- <property name="hibernate.current_session_context_class">thread</property>  -->          <mapping  class="cn.codeWang.entity.Person"/>        <mapping  class="cn.codeWang.entity.Phone"/>    </session-factory></hibernate-configuration>

3.测试类

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codeWang.entity.Person;import cn.codeWang.entity.Phone;public class DemoTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init() {        // 创建服务注册对象        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();        // 创建会话工厂对象        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();        // 会话对象        session = sessionFactory.openSession();        // 开启事物        transaction = session.beginTransaction();    }    @After    public void destory() {        // 提交事物        transaction.commit();        // 关闭会话        session.close();        // 关闭会话工厂        sessionFactory.close();    }    @Test    // 向数据库中添加数据    public void testSave() {        Person person = new Person();        Phone phone1 = new Phone("123-456-7892");        Phone phone2 = new Phone("123-456-7893");        person.getPhones().add(phone1);        person.getPhones().add(phone2);        session.save(phone1);        session.save(phone2);        session.save(person);    }}

总结:@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)修饰集合属性。

2.一对多双向外键关联
代码如下:

package cn.codeWang.entity;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.OneToMany;@Entity(name = "Person")public class Person {    @Id    @GeneratedValue    private Long id;    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)    private List<Phone> phones = new ArrayList<>();    public Person() {    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public List<Phone> getPhones() {        return phones;    }    public void addPhone(Phone phone) {        phones.add(phone);        phone.setPerson(this);    }    public void removePhone(Phone phone) {        phones.remove(phone);        phone.setPerson(null);    }}package cn.codeWang.entity;import java.util.Objects;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;import org.hibernate.annotations.NaturalId;@Entity(name = "Phone")public class Phone {    @Id    @GeneratedValue    private Long id;    @NaturalId    @Column(name = "`number`", unique = true)    private String number;    @ManyToOne    private Person person;    public Phone() {    }    public Phone(String number) {        this.number = number;    }    public Long getId() {        return id;    }    public String getNumber() {        return number;    }    public Person getPerson() {        return person;    }    public void setPerson(Person person) {        this.person = person;    }    @Override    public boolean equals(Object o) {        if ( this == o ) {            return true;        }        if ( o == null || getClass() != o.getClass() ) {            return false;        }        Phone phone = (Phone) o;        return Objects.equals( number, phone.number );    }    @Override    public int hashCode() {        return Objects.hash( number );    }}import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codeWang.entity.Person;import cn.codeWang.entity.Phone;public class DemoTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init() {        // 创建服务注册对象        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();        // 创建会话工厂对象        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();        // 会话对象        session = sessionFactory.openSession();        // 开启事物        transaction = session.beginTransaction();    }    @After    public void destory() {        // 提交事物        transaction.commit();        // 关闭会话        session.close();        // 关闭会话工厂        sessionFactory.close();    }    @Test    // 向数据库中添加数据    public void testSave() {        Person person = new Person();        Phone phone1 = new Phone( "123-456-7890" );    }}

控制台输出结果:

Hibernate:     create table Person (       id bigint not null,        primary key (id)    ) engine=MyISAMHibernate:     create table Phone (       id bigint not null,        `number` varchar(255),        person_id bigint,        primary key (id)    ) engine=MyISAMHibernate:     alter table Phone        add constraint UK_l329ab0g4c1t78onljnxmbnp6 unique (`number`)Hibernate:     alter table Phone        add constraint FKmw13yfsjypiiq0i1osdkaeqpg        foreign key (person_id)        references Person (id)

总结:两个持久化类中出现“你中有我,我中有你”。
1.@OneToMany(mappedBy = “person”, cascade = CascadeType.ALL, orphanRemoval = true)修饰集合属性。
2. @ManyToOne修饰private Person person;
3.Phone类必须实现hashCade()和equals()方法

阅读全文
0 0
原创粉丝点击