Hibernate 关联映射

本文介绍在Hibernate中如何实现多对多及一对一的关系配置,包括使用注解完成多对多配置的方法、一对一关系中主键映射的实现方式等。

1.1多对多关系

1.1.1使用注解完成多对多配置。
使用manyToMany来配置多对多,只需要在一端配置中间表,另一端使用mappedby表示外键维护。
A.创建PO类
    Teacher类中:
    @Entity
@Table(name="t_teacher")

public class Teacher {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    @ManyToMany(targetEntity = Student.class,mappedBy="teacher")//代表由对方维护外键
    private Set<Student> students = new HashSet<Student>();
Student类:
@Entity
@Table(name = "t_student")

public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;


    private String name;
    @ManyToMany(targetEntity = Teacher.class)
//  使用joinTable来描述中间表,并在描述中间表中外键与Student,Teacher的映射关系。
//  joinColumn它是用来描述Student与中间表的映射关系
//  inverseJoinColumn它是用来描述Teacher与中间表中的映射关系。
    @JoinTable(name="s_t",joinColumns={@JoinColumn(name="c_student_id")},inverseJoinColumns={@JoinColumn(name="c_teacher_id")})
    private Set<Teacher> students = new HashSet<Teacher>();
//  测试多对多级联保存,保存学生时保存老师

    @Test
    public void test4(){
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//      创建两个老师
        Teacher t1 = new Teacher();
        t1.setName("tommy");

        Teacher t2 = new Teacher();
        t2.setName("hans");

//      创建两个学生
        Student s1 = new  Student();
        s1.setName("tommy2");

        Student s2 = new  Student();
        s2.setName("hans2");

//      学生关联老师
        s1.getTeacher().add(t1);
        s1.getTeacher().add(t2);

        s2.getTeacher().add(t1);
        s2.getTeacher().add(t2);

//      保存学生
        session.save(s1);
        session.save(s2);

        session.getTransaction().commit();
        session.close();
    }
问题:如果我们在多对多中双方都建立了级联删除。
如果我们将tommy删除了会有什么结果?
--所有的级联数据全部没有了。

2.一对一的关系

以人与身份证号为例
1.创建实体类
@Entity
@Table(name="t_user")

public class User {

    @Id
    @GenericGenerator(strategy="uuid",name="myuuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    private String name;
    @OneToOne(targetEntity=IDCard.class,mappedBy="user")
    private IDCard idCard;

t_user放弃对外键的维护权利
public class IDCard {
    @Id
    @GenericGenerator(strategy="uuid",name="myuuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    private String cardNum;

    @OneToOne(targetEntity=User.class)
    @JoinColumn(name="c_user_id")
    @Cascade(CascadeType.SAVE_UPDATE)
    private User user;

joincolumn指定外键列名称,当前配置外键是在t_idcard表中。

3.主键映射

Husband和wife为例:
@Entity
@Table(name = "t_wife")

public class wife {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;

    @OneToOne
    @PrimaryKeyJoinColumn
    private Husband husband;
}
wife的主键生成策略是identity
@primaryKeyColumn说明husband与wife是使用主键映射。

@Entity
@Table(name="t_husband")
public class Husband {

    @Id
//  @GeneratedValue(strategy=GenerationType.IDENTITY)

    @GenericGenerator(name="myForeignKey", strategy="foreign", parameters={@Parameter(name="property",value="wife")})
    @GeneratedValue(generator="myForeignKey")
    private int id;
    private String name;

    @OneToOne
    @PrimaryKeyJoinColumn
    private wife wife;

}

Husband的主键我们设置成参考wife的主键方式。
测试代码:
//  测试一对一主键生成策略
    @Test
    public void test7(){
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

        Husband husband = new Husband();
        husband.setName("tommy");

        wife w1 = new wife();
        w1.setName("johnson");

//      双向关联
        husband.setWife(w1);
        w1.setHusband(husband);

        session.save(w1);
        session.getTransaction().commit();
        session.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值