分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

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

发布时间:2023-09-06 01:24责任编辑:白小东关键词:暂无标签

实体之间的映射关系

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

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

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

一对一单向外键关联

@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;/*身份证类*/@Entitypublic 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注解-关系映射级别注解

原文地址:http://www.cnblogs.com/alsf/p/7823303.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved