Hibernate 注解(Annotations 二)一对一双向注解

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

接下来我们讲解一下一对一的注解配置:

上一篇文档已经详细解说了各个注解的含义和作用,在这里就不详细说明了,直接使用了。

1.创建两个实体类(Student类和IdCard类)

   Student类

package cn.onetoone.entity;

import javax.persistence.*;

/**
 * Created by accp on 2017/2/8.
 */
@Entity
@Table(name = "Student")
public class Student {
    @Id
    @GeneratedValue
    private Integer sid;
    @Column
    private String sname;
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "cid")
    private IdCard idCard;

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public IdCard getIdCard() {
        return idCard;
    }

    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }
}

IdCard类:

package cn.onetoone.entity;

import javax.persistence.*;

/**
 * Created by accp on 2017/2/8.
 */
@Entity
@Table
public class IdCard {
    @Id
    @GeneratedValue
    private Integer cid;
    @Column
    private String cname;
    @OneToOne(mappedBy = "idCard")
    //把维护权交给Student
    private Student stu;

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public Student getStu() {
        return stu;
    }

    public void setStu(Student stu) {
        this.stu = stu;
    }
}

2.在大配置中需要添加:

 <mapping class="cn.onetoone.entity.Student"/>
 <mapping class="cn.onetoone.entity.IdCard"/>

3.测试类:

 

package cn.onetoone.test;

import cn.onetoone.entity.IdCard;
import cn.onetoone.entity.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Created by accp on 2017/2/8.
 */
public class OneToOneTest {
    Configuration cfg;
    Session session;
    Transaction tx;
    @Before
    public void mybefore(){
        cfg=new Configuration().configure();
        SessionFactory factory=cfg.buildSessionFactory();
        session=factory.openSession();
        tx=session.beginTransaction();
    }

    @After
    public void myafter(){
        tx.commit();
        session.close();
    }

    @Test
    public void add(){
        Student stu=new Student();
        stu.setSname("李四");

        IdCard idCard=new IdCard();
        idCard.setCid(1234566789);
        idCard.setCname("身份证");

        stu.setIdCard(idCard);
        session.save(idCard);
        session.save(stu);

    }
}

生成的sql:

Hibernate: 
    insert 
    into
        IdCard
        (cname, cid) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        Student
        (cid, sname, sid) 
    values
        (?, ?, ?)

数据库数据:

Student表                           IdCard表

 

posted @ 2017-02-16 12:23  刘二雄  阅读(949)  评论(0编辑  收藏  举报