Java实体对象外键关联注解_06-hibernate注解-一对多单向外键关联

本文介绍了在Java中使用Hibernate注解实现一对多单向外键关联的方法,包括在学生类和班级类中的注解配置,如@OneToMany和@JoinColumn,并通过代码示例展示了如何在班级类中添加学生对象,实现两者关联。测试代码演示了如何保存学生和班级对象,确保外键关联的正确性。
摘要由CSDN通过智能技术生成

一对多单向外键

1,一方持有多方的集合,一个班级有多个学生(一对多)。

2,@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)  //级联关系,抓取策略:懒加载。

@JoinColumn(name="cid")   //指定name为被控方中被作为外键的属性。

总结抓取策略:多对一时候,多方设置EAGER,一方设置LAZY。

此时因为一个班级拥有多个学生的集合,因此需要用班级添加学生对象集合,所以要在班级里面增加添加学生的方法。

步骤:

第一步:新增学生类:

注意:1,此时因为要用班级类添加学生,所以在学生类里面用不到班级类属性。

packageotm_fk;importjava.util.Date;importjavax.persistence.CascadeType;import javax.persistence.Entity;/*JPA主键*/

importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.Table;/*学生实体类*/@Entity

@Table(name="Students",schema="sys")public classStudents {private intsid;privateString name;private String gender;//性别

privateDate birthday;private String major;//专业

publicStudents()

{

}publicStudents( String name,String gender, Date birthday, String major) {//super();

this.name=name;this.gender =gender;this.birthday =birthday;this.major =major;

}

@Id

@GeneratedValue//主键自动增长

public intgetSid() {returnsid;

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

}publicString getGender() {returngender;

}public voidsetGender(String gender) {this.gender =gender;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicDate getBirthday() {returnbirthday;

}public voidsetBirthday(Date birthday) {this.birthday =birthday;

}publicString getMajor() {returnmajor;

}public voidsetMajor(String major) {this.major =major;

}

}

第二步:新建班级类:

1,因为要用班级类新增学生类,这里使用集合保存学生类对象。

2,给学生类集合添加注解:@OneToMany,获取方式为懒加载 FetchType.LAZY。

3,此时虽然在班级类里面注解,但是依然是cid在学生类里面做外键,所以,依然是@JoinColumn(name="cid")。

packageotm_fk;importjava.util.Set;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.OneToMany;importorg.hibernate.annotations.GenericGenerator;//班级实体类

@Entitypublic classClassRoom {

@Id

@GeneratedValue(generator="cid") //因为主键是String类型,不是int,不能自动生成,所以必须使用主键生成器

@GenericGenerator(name="cid", strategy="assigned")//指定生成策略为手工赋值

@Column(length=4) //指定主键长度

private String cid;//班级的编号

private String cname;//班级的名字

@OneToMany(cascade= {CascadeType.ALL},fetch=FetchType.LAZY)

@JoinColumn(name="cid")private Set stus; //一方持有多方的集合

publicClassRoom()

{

}publicClassRoom(String cid, String cname) {//super();

this.cid =cid;this.cname =cname;

}public Set getStus() {

return stus;

}

public void setStus(Set stus) {

this.stus = stus;

}publicString getCid() {returncid;

}public voidsetCid(String cid) {this.cid =cid;

}publicString getCname() {returncname;

}public voidsetCname(String cname) {this.cname =cname;

}

}

测试新增:

注意:1,因为班级类新增学生类,所以建立两个学生集合,用班级对象set方法添加,来关联起学生类和班级类。

2,因为是班级类添加学生类对象。所以先保存学生类对象,然后保存班级对象。

packageotm_fk;importjava.util.Date;importjava.util.EnumSet;importjava.util.HashSet;importjava.util.Set;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.hibernate.boot.Metadata;importorg.hibernate.boot.MetadataSources;importorg.hibernate.boot.registry.StandardServiceRegistryBuilder;importorg.hibernate.cfg.Configuration;importorg.hibernate.service.ServiceRegistry;importorg.hibernate.tool.hbm2ddl.SchemaExport;importorg.hibernate.tool.schema.TargetType;importorg.junit.Test;public classtestStudents {

@Testpublic voidtestSchemaExport()

{//创建服务注册对象

ServiceRegistry serviceRegistry = newStandardServiceRegistryBuilder().configure().build();//创建Metadata对象

Metadata metadata =newMetadataSources(serviceRegistry).buildMetadata();//创建SchemaExport对象

SchemaExport export = newSchemaExport();

export.create(EnumSet.of(TargetType.DATABASE),metadata);

}

@Testpublic voidaddStudetns()

{

Configuration config=newConfiguration().configure();//创建服务注册对象。

ServiceRegistry serviceRegistry = newStandardServiceRegistryBuilder().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(),"计算机专业");//创建两个集合

Set set1=new HashSet();

set1.add(s1);

set1.add(s2);

Set set2=new HashSet();

set2.add(s3);

set2.add(s3);

//如果缺少这句话,就会因为学生类和班级类没有关联起来,导致学生类里面的外键值为空。

c1.setStus(set1);

c2.setStus(set2);//保存学生

session.save(s1);

session.save(s2);

session.save(s3);

session.save(s4);//保存班级

session.save(c1);

session.save(c2);

transaction.commit();

}

}

最后结果:

5ebcac168cb719f036bd34b7ac116978.png

3d20657ccf0973635f1077b782a1f36a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值