JPA实体关系映射

本文详细介绍了JPA中的实体关系映射,包括一对一、一对多和多对多的单向和双向关联,以及主键关联。通过具体示例展示了如何使用@OneToOne、@ManyToOne、@OneToMany和@ManyToMany等注解进行关系映射,同时讲解了级联操作、外键关联和表关联的实现方式。
摘要由CSDN通过智能技术生成


实体关系是指实体与实体之间的关系,从方向上分为单向关联和双向关联,从实体数量上分为一对一、一对多、多对多等。对于任何两个实体,都要从这两个方面区分它们之间的关系。

单向关联是一个实体中引用了另外一个实体,也即通过一个实体可以获取另一个实体对象的引用;双向关联是两个实体之间可以相互获取对方对象的引用。

1、一对一

学生和身份证是一对一的关系,下面将从单向关联和双向关联来分析。

1.1、单向关联

假设在学生实体中可以获取身份证对象的引用;反之,不能在身份证实体中获取学生对象的引用,则学生和身份证是一对一的单向关联关系,关系映射如下:

@Entity

@Table(name="t_IDCard")

public class IDCard implements Serializable

{

   private static final long  serialVersionUID   = 1L;

    private Stringnum;

   

    public IDCard()

    {

      

    }

    @Id

   @GeneratedValue

   public String getNum()

   {

      return num;

   }

 

   public void setNum(String num)

   {

      this.num =num;

   }

/*

     * ....

     * */

}

@Entity

@Table(name="t_student")

public class Student implements Serializable

{

   private static final long  serialVersionUID   = 1L;

   private int id;

   private IDCardidCard;

  

   public Student(){}

 

   @Id

   @GeneratedValue

   public int getId()

   {

      return id;

   }

 

   public void setId(intid)

   {

      this.id =id;

   }

 

   @OneToOne(cascade=CascadeType.ALL)

   @JoinColumn(name="IDCrad_id")

   public IDCardgetIdCard()

   {

      return idCard;

   }

  

   public void setIdCard(IDCard idCard)

   {

      this.idCard =idCard;

   }

/*

     * ....

     * */

}

 

@OneToOne只能确定实体与实体的关系是一对一的关系,不能指定数据库表中的保存的关联字段,所以要结合@JoinColumn来指定关联字段。

在默认情况下,关联实体(IDCard)的主键一般是用来做外键的。但如果此时不想将关联实体的主键作为外键,而是将其他字段作为关联字段(外键可以关联到其他表的主键上,也可以关联到其他表的非空字段上),此时需要设置@JoinColumn的referencedColumnName属性。

 

1.2、双向关联

@Entity

@Table(name="T_IDCARD")

public class IDCard implements Serializable

{

   private static final long  serialVersionUID   = 1L;

    private Stringnum;

    private Studentstudent;

   

    public IDCard()

    {

      

    }

    @Id

   @GeneratedValue

   public String getNum()

   {

      return num;

   }

 

   public void setNum(String num)

   {

      this.num =num;

   }

  

   @OneToOne(mappedBy="idCard")

   public StudentgetStudent()

   {

      return student;

   }

   public void setStudent(Student student)

   {

      this.student =student;

   }

   /*

    * ....

    * */

  

}

 

@Entity

@Table(name="T_STUDENT")

public class Student implements Serializable

{

   private static final long  serialVersionUID   = 1L;

   private int id;

   private IDCardidCard;

  

   public Student(){}

 

   @Id

   @GeneratedValue

   public int getId()

   {

      return id;

   }

 

   public void setId(intid)

   {

      this.id =id;

   }

 

   @OneToOne(cascade=CascadeType.ALL)

   @JoinColumn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值