zoukankan      html  css  js  c++  java
  • 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了。

  • 相关阅读:
    Openwrt单独编译某一个模块而不是整个固件
    在ubuntu 14.04 编译android 2.3.1 错误解决办法
    使用cydia substrate 来进行android native hook
    使用Privoxy转化SSH到HTTP代理
    使用xposed 来解阿里ctf-2014 第三题
    一个android dex 转java源码工具
    git CVE-2014-9390 验证以及源码对比
    一键结束port 5037占用
    运动物体检测——光流法(摄像机固定)
    运动目标检测ViBe算法
  • 原文地址:https://www.cnblogs.com/alsf/p/7823303.html
Copyright © 2011-2022 走看看