04-hibernate注解-一对一双向外键关联

一对一双向外键

1,主控方的配置同一对一单向外键关联。

2,@OneToOne(mappedBy="card")  //被控方

@OneToOne(mappedBy="card") //mappedBy所对应的是主控方外键属性的值

双向关联,必须设置mappedBy属性,因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存

主控方类代码不用修改:

package oto_bfk;

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;
    }
}

被控方的代码修改如下:

需要注意的是:@OneToOne(mappedBy="card") //mappedBy所对应的是主控方外键属性的值

package oto_bfk;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;

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;//学生姓名
    
    @OneToOne(mappedBy="card") //mappedBy所对应的是主控方外键属性的值。
    private Students stu;
    
    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;
    }
    public Students getStu() {
        return stu;
    }
    public void setStu(Students stu) {
        this.stu = stu;
    }
}

一对一双向外键联合主键

1,创建主键类

2,主键类必须实现serialization接口,重写hashcode()和equals()方法。

主键类

@Embeddable

实体类

@EmbeddedId

这个可以参考前面的属性注解。

http://www.cnblogs.com/alsf/p/7823134.html

原文地址:https://www.cnblogs.com/alsf/p/7827971.html