多对一单向外键

1,多方持有一方的引用,比如:多个学生对应一个班级(多对一)

2,@ManyToOne(cascade={CascadeType.ALL},  fetch=FetchType.EAGER)     cascade表示一种级联关系fetch表示抓取策略(eager表示渴望,积极)

@JoinColumn(name="cid", referencedColumnName="CID")   表示多方持有一方引用,一方的外键用name表示,referencedColumnName表示对应数据库里面字段

第一步:创建外键类:班级类。

注意:1,别忘了加上实体类的注解:@Entity。2,给主键加上注解:因为主键是String类型,不能自动生成,所以加上主键生成器@GeneratedValue,并且指定主键生成

策略为手工赋值@GenericGenerator。为了控制String长度,加上@Column注解。

package mto_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 ClassRoom { @Id
@GeneratedValue(generator
="cid") //因为主键是String类型,不是int,不能自动生成,所以必须使用主键生成器
@GenericGenerator(name="cid", strategy="assigned")//指定生成策略为手工赋值
@Column(length=4) //指定主键长度
private String cid;//班级的编号

private String cname;//班级的名字 public ClassRoom()
{ } public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}

第二步:创建学生类,作为主控方,代码如下:

注意:1,给教室类的属性,的get方法加上注解:@ManyToOne,

2,指定这个类的属性里面作为学生类的外键的属性cid,并且指定该外键在表中的字段为CID。@JoinColumn(name="cid", referencedColumnName="CID")。

(注意,教室类作为属性的在里面的作用就是指定学生类的外键,也就是指定cid,映射为表里面的字段为CID)

package mto_fk;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;/*JPA主键*/
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; /*学生实体类*/
@Entity
@Table(name="Students",schema="sys")
public class Students { private int sid;
private String gender;//性别
private Date birthday;
private String major;//专业 private ClassRoom classRoom;//教室
public Students()
{ } public Students( int sid,String gender, Date birthday, String major) {
//super();
this.sid=sid;
this.gender = gender;
this.birthday = birthday;
this.major = major;
} @Id
@GeneratedValue
//主键自动增长
public int
getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
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;
} @ManyToOne(cascade= {CascadeType.ALL},fetch=FetchType.EAGER) //级联关系和抓取策略
@JoinColumn(name="cid", referencedColumnName="CID") //指定外键字段
public
ClassRoom getClassRoom() {
return classRoom;
} public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
} }

注册到配置:

添加测试:

package mto_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);
}
}

运行成功后表:

测试添加记录:

1,因为sid自动生成,所以构造函数不要永sid的属性

package mto_fk;
import java.util.Date;
import java.util.EnumSet;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
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 addStudetns()
{
Configuration config=new Configuration().configure();
//创建服务注册对象。
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建会话工厂对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction(); //创建班级对象
ClassRoom c1=new ClassRoom("C001","软件工程");
ClassRoom c2=new ClassRoom("C002","网络工程");
//创建学生对象
Students s1=new Students("张三","男",new Date(),"计算机专业");
Students s2=new Students("李四","男",new Date(),"计算机专业");
Students s3=new Students("王五","男",new Date(),"计算机专业");
Students s4=new Students("赵六","男",new Date(),"计算机专业");
//设置班级
s1.setClassRoom(c1);
s2.setClassRoom(c1);
s3.setClassRoom(c2);
s4.setClassRoom(c2);
//保存班级
session.save(c1);
session.save(c2);
//保存学生
session.save(s1);
session.save(s2);
session.save(s3);
session.save(s4); transaction.commit();
}
}

测试结果:可见sid是自动生成,自动叠加的。

05-hibernate注解-多对一单向外键关联的更多相关文章

  1. 08-hibernate注解-多对多单向外键关联

    多对多单向外键 1,学生和教师构成多对多的关联关系 2,其中一个多方持有另一个多方的集合对象(学生持有教室的集合) 3,通过注解@JoinTable,创建中间表(作为多对多的载体,用来确定学生和教师的 ...

  2. 08-hibernate注解-多对多双向外键关联

    多对多双向外键 双方持有对方的集合对象 其中一方设置: //教师类 @ManyToMany(mappedBy="teachers")   //mappedby表示教师交给学生来控制 ...

  3. 06-hibernate注解-一对多单向外键关联

    一对多单向外键 1,一方持有多方的集合,一个班级有多个学生(一对多). 2,@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY ) / ...

  4. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

  5. Hibernate注解:一对多外键关联

    情形:两个表,cms_mode是主表,cms_model_field是子表,cms_model_field的model_id字段关联到cms_model的主键. # # Source for tabl ...

  6. hibernate多对一单向外键

    hibernate多对一单向外键: 描述:

  7. Hibernate一对一单向外键关联

    一.一对一单向外键关联: 一对一单向外键关联主要用到了以下两个注解: 1.OneToOne(cascade=CasecadeTYPE.ALL); cascade=CasecadeTYPE.ALL:表示 ...

  8. Hibernate 再接触 关系映射 一对一单向外键关联

    对象之间的关系 数据库之间的关系只有外键 注意说关系的时候一定要反面也要说通 CRUD 数据库之间设计 主键关联 单向的外键关联 中间表 一对一单向外键关联 Husband.java package ...

  9. hibernate5(12)注解映射[4]一对一外键关联

    在实际博客站点中,文章内容的数据量非常多,它会影响我们检索文章其他数据的时间,如查询公布时间.标题.类别的等. 这个时候,我们能够尝试将文章内容存在还有一张表中,然后建立起文章--文章内容的一对一映射 ...

随机推荐

  1. 【Shell】一些比较有用、常用的shell命令

    最近帮着老大做一些服务器上的日志处理任务,小弟之前只是稍微会用点Linux,但是一些高级的命令基本不会,经过一番折腾,总结了几个自认为比较有用的命令,之后学到更多的再来补充. 一.文本处理:awk 二 ...

  2. NetCore2.0 RozarPage自动生成增删改查

    原文链接:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger 上面的只是原文 ...

  3. 树形dp入门(poj 2342 Anniversary party)

    题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚 ...

  4. Electron与jQuery中$符号冲突的三种解决方法

    在Electron工程中引用jQuery时,经常会出现以下错误: Uncaught ReferenceError: $ is not defined 解决的具体方法如下: ①.在测试的过程中(测试过1 ...

  5. [BZOJ2109][NOI2010]航空管制(贪心+拓扑)

    2109: [Noi2010]Plane 航空管制 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1227  Solved: 510[Submit][ ...

  6. ListView EditText 实现的三种方式

    原文网址:http://blog.sina.com.cn/s/blog_682139d001013omd.html 这段时间搞一个android表格,真是搞死人,让我想到iphone开发是何其的简单啊 ...

  7. XMPP资源绑定(Resource Binding)与单台设备登录控制

    原文:http://blog.csdn.net/brasbug/article/details/26353511 一个XMPP的账号由三部分组成: 用户名(user/node),域名(domain)和 ...

  8. 万里长征第二步——django个人博客(第五步 ——配置后台admin)

    在urls.py文件中配置admin路径 from django.conf.urls import url from django.contrib import admin from blog.vie ...

  9. [转]SSIS高级转换任务—在Package中是用临时表是需要设置RetainSameConnection属性

    本文转自:http://www.cnblogs.com/tylerdonet/archive/2011/05/20/2052306.html 在上一个导入列这个例子中我们创建一个实际的表来存储文件路径 ...

  10. [转]Understanding Integration Services Package Configurations

    本文转自:http://msdn.microsoft.com/en-us/library/cc895212.aspx Introduction With the 2008 release, SQL S ...