Hibernate基础之八:一对一单/双向,主/外键关联 @OneToOne@JoinColumn


1:一对一,单向,外键关联

Student和stusentIDCard两张表是一对一的关系,即一个学生只有一个学生证,一个学生证只对应一个学生

Stuent表里有个外键要参考StudentIDCard

表现类上就是Student实例里聚合一个stusentIDCard

@Entity
public class Student 
{
	private int id;
	private String name;
	private int age;
	private StudentIDCard cardId;
	
	@Id
	@GeneratedValue//可以定单独的自增序列,这共用一个
	public int getId() {
		return id;
	}
	@OneToOne//一对一的关系
	@JoinColumn(name="card_Id")//指定外键名称是card_Id
	public StudentIDCard getCardId() {
		return cardId;
	}


@Entity
public class StudentIDCard 
{
	private int id;
	private String kinds;
	private Date datePublished;
	
	@Id
	@GeneratedValue//可以定义单独的自增序列,这里共用一个
	public int getId() {
		return id;
	}

测试类

	@Test
	public void testIN() {	
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        StudentIDCard sic = new StudentIDCard();
        sic.setKinds("primarySchool");
        sic.setDatePublished(new Date());
        session.save(sic);
        
		Student s = new Student();
		s.setName("李四");
		s.setAge(0);
		s.setCardId(sic);
        session.save(s);

        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();         
	}
	@Test
	public void testShow() {
		new SchemaExport(new AnnotationConfiguration().configure()).create(false,true);
	}


建表结果:

foreign key (card_Id) references StudentIDCard

16:15:13,184 DEBUG SchemaUpdate:226 - create table Student (id number(10,0) not null, age number(10,0) not null, name varchar2(255 char), card_Id number(10,0),primary key (id))
16:15:13,193 DEBUG SchemaUpdate:226 - create table StudentIDCard (id number(10,0) not null, datePublished timestamp, kinds varchar2(255 char), primary key (id))
16:15:13,200 DEBUG SchemaUpdate:226 - alter table Student add constraint FKF3371A1BEA113360foreign key (card_Id)references StudentIDCard


PowerDesigner里反向工程出来的图如下:


就是Student表里的字段要去参考StudenIDCard表里的东西,外键名字我指定的是:“CARD_ID”







2:一对一,双向,外键关联

双向表现在类上就是:Student和stusentIDCard互相聚合一个实例,

双方都标注@OneToOne


Student类不变,参考上边那个,不赘述了

@Entity
public class StudentIDCard 
{
	private int id;
	private String kinds;
	private Date datePublished;
	private Student student;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	@OneToOne//互相持有,都加了OneToOne
	public Student getStudent() {
		return student;
	}

但这样就等于会在表里出现重复的字段,还要设置mappedBy,说明对方是主导,消除冗余
StudentIDCard类的getStudent()上
@OneToOne(mappedBy="StudentIDCard")说明对方是主导,对方(Student)的"cardId"属性已经做映射了,消除互相是外键的冗余
getStudent()

	@OneToOne(mappedBy="cardId")//说明对方是主导,对方(Student)的"cardId"属性已经做映射了,消除互相是外键的冗余
	public Student getStudent() {
		return student;
	}




3:一对一,单向,主键关联

@JoinColumn换成 @PrimaryKeyJoinColumn//指定外键名字

@JoinColumn换成@PrimaryKeyJoinColumn//指定外键名字

















  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值