03-hibernate注解-关系映射级别注解

Posted 美好的明天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03-hibernate注解-关系映射级别注解相关的知识,希望对你有一定的参考价值。

实体之间的映射关系

一对一:一个公民对应一个身份证号码

一对多(多对一):一个人可以有多个银行账号

多对多:一个学生有多个老师,一个老师有多个学生。

 

一对一单向外键关联

@OneToOne(cascade=cascadeType.ALL)(cascade表示级联关系)

@JoinColumn(name="pid",unique=true)     name表示外键。

注意:保存时候应该先保存外键对象,再保存主表对象

 

第一步:先建立外键属于的表的实体类:身份证类

注意:1,因为pid类型不是int,所以不能自动生成,所以给他指定一个生成器@GeneratedValue,并且构建一个生成器,生成策略为手工赋值@GenericGenerator(name="pid",strategy="assigned")。2,因为String类型做主键需要控制大小,这里指定长度18.

package oto_fk;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator;

/*身份证类*/
@Entity
public class IdCard {

    @Id
    @GeneratedValue(generator="pid")//指定一个生成器为pid
    @GenericGenerator(name="pid",strategy="assigned")//构建一个生成器,生成策略strategy为手工赋值
    @Column(length=18)
    private String pid;//身份证号码
    private String sname;//学生姓名
    
    public IdCard()
    {
        
    }
    public IdCard(String pid, String sname) {
        //super();
        this.pid = pid;
        this.sname = sname;
    }

    public String getPid() {
        return pid;
    }
    public void setPid(String pid) {
        this.pid = pid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
}

第二步:建立学生实体类,这个学生类包含身份证的主键,作为外键。

注意:1,定义id为主键@Id,并且自动增长@GeneratedValue。

2,定义外键属性,并且给外键属性的get方法,加上注解:一对一的全级联关系。指定被控类(身份证类)的主键字段(pid)。

3,因为主键是自动增长的,所以,有参数的构造方法里面,不需要sid这个属性,去掉。

package oto_fk;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;/*JPA主键*/
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/*学生实体类*/
@Entity
@Table(name="Students",schema="sys")
public class Students {
    
    private IdCard card;//身份证对象
    
    private int sid;
    private String gender;//性别
    private Date birthday;
    private String major;//专业
    
    public Students()
    {
        
    }
    
    public Students(IdCard card, String gender, Date birthday, String major) {
        //super();
        this.card=card;
this.gender = gender; this.birthday = birthday; this.major = major; } @Id @GeneratedValue //主键自动增长 public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } @OneToOne(cascade=CascadeType.ALL)//全级联的级联关系 @JoinColumn(name="pid",unique=true)//被控类对应的主键为pid public IdCard getCard() { return card; } public void setCard(IdCard card) { this.card = card; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } }

第三步:给两个类注册到配置文件里面:

第四步:建立测试类:

package oto_fk;
import java.util.EnumSet;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import org.junit.Test;

public class testStudents {
    
    @Test
    public void testSchemaExport()
    {
        //创建服务注册对象
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
        //创建Metadata对象
        Metadata metadata =new MetadataSources(serviceRegistry).buildMetadata();
        //创建SchemaExport对象
        SchemaExport export = new SchemaExport();  
        export.create(EnumSet.of(TargetType.DATABASE),metadata);
    }

}

第五步:调试成功,成功生成两个表:

 

测试一下刚刚的效果:建立一个测试用例:

注意:两个类对象的保存顺序是,先保存外键表身份证,再保存学生类

@Test
    public void testAddStudents()
    {
        //创建配置对象
        Configuration config=new Configuration().configure();
        //创建服务注册对象。
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
        //创建会话工厂对象
        SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
        //创建会话对象
        Session session=sessionFactory.openSession();
        //开启事务
        Transaction transaction=session.beginTransaction();
        
        //生成一个身份证对象
        IdCard card=new IdCard("232423232432","张无忌");
        //再生成一个学生对象
        Students s=new Students(card,"男",new Date(),"计算机");
        
        session.save(card);
      session.save(s);
        transaction.commit();
    
    }

查询结果:以下结果可见,身份证主键顺利存到学生类,作为主键,并且学生类主键已经为1了。

 

以上是关于03-hibernate注解-关系映射级别注解的主要内容,如果未能解决你的问题,请参考以下文章

01-hibernate注解:类级别注解准备工作

Hibernate注解配置

Hibernate注解-类级别注解

MyBatis注解开发---实现自定义映射关系和关联查询

hibernate注解

Hibernate基于注解的双向one-to-many映射关系的实现