JPA关系映射

@OneToOne 一对一

@OneToMany 一对多

@ManyToOne 多对一

@ManyToMany 多对多

其含义为类本身所代表的表与加上上述注解的成员(字段)所代表的表之间是一对一,一对多,多对一,多对多 关系.

@JoinColumn 注解

@JoinColumn注解的是保存表与表之间关系的字段,它要标注在实体属性上.

示例:

class address{

...

@OneToOne
@JoinColumn(name = "addr_id")
private AddressEO addressEO;

}

将会在AddressEO对应的表上增加 addr_id字段该字段 外键引用 address表的主键.

若不设置@JoinColumn属性name的值,则name默认遵循以下取值规则规则:

name=关联表的名称+“_”+ 关联表主键的字段名

1.考试类

 

@Entity

public classExam implementsSerializable {

 

  private static final long serialVersionUID= 1L;

  

  @Id

  @GeneratedValue

  private Integer id 

  private Integer paperId;

  private Integer userId

  @Temporal(TemporalType.TIMESTAMP)

  private Date startTime

  @Temporal(TemporalType.TIMESTAMP)

  private Date endTime;

  private Integer score 

  private String remark 

  private Integer status;

  

  @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="exam")

  private List<ExamUserAns>listExamUserAns= newArrayList<ExamUserAns>();

 

  //get and set method here ……

 

}

 

Cascade 级联操作
CascadeType.
PERSIST 级联持久化 ( 保存 ) 操作
CascadeType.
MERGE 级联更新 ( 合并 ) 操作
CascadeType.
REFRESH 级联刷新操作,只会查询获取操作
CascadeType.
REMOVE 级联删除操作
CascadeType.
ALL 级联以上全部操作
Fetch
抓取是否延迟加载,默认情况一的方为立即加载,多的一方为延迟加载
mappedBy
关系维护
mappedBy=
"exam" 表示在ExamUserAns 类中的 exam 属性来维护关系,这个名称必须和ExamUserAns中的exam属性名称完全一致才行。

另外需要注意Exam类中的集合类型必须是List或者Set,不能设置为ArrayList,否则会报错

Illegal attempt to map non collection as…

 

2.考试答案类

@Entity

public class ExamUserAns implements Serializable {

 

  private static final long serialVersionUID = 1L;

  

  @Id

  @GeneratedValue

  private Integer id;

  

  private Integer questionId;

  

  private String answer;

  

  private Integer score;

  

  private String remark;

  

  @ManyToOne(cascade=CascadeType.ALL)

  @JoinColumn(name="examId")

  private Exam exam;

 

//get and set method here ……

 

}

 

3.数据持久化存储

JPA实现一对多(OneToMany)关联

 

需要注意的是,在持久化存储时,我们只需要对Exam类进行merge或者persist即可,JPA会自动将其集合关联类进行持久化存储,而不需要我们对ExamUserAns再执行persist方法,但是我们需要设置examUserAns.setExam(exam)来维护这种关联。


对于mappedBy复习下:

a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
b) mappedBy标签一定是定义在the owned side(被拥有方的),他指向the owning side(拥有方);
c) mappedBy的含义,应该理解为,拥有方能够自动维护 跟被拥有方的关系;

 

   当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的。
d) mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被 拥有方。mappedBy这方定义的JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表


人跟身份证双向关联

Person里面定义的注解:

@OneToOne(cascade={CascadeType.ALL},optional=true)
public IDCard getIdCard() {
         return idCard; 
}

IDCard里面定义的注释:
@OneToOne(cascade=CascadeType.ALL,mappedBy="idCard",optional=false) 
public Person getPerson() { 
       return person; 
}
多了一个mappedBy这个方法,它表示什么呢?它表示当前所在表和Person的关系是定义在Person里面的idCard这个成员上面的,它表示此表是一对一关系中的从表,也就是关系是在person表里面维护的,这一点很重要.Person表是关系的维护者,owner side,有主导权,它有个外键指向IDCard。
我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让Person来维护整个关系,这样更符合我们正常的思维.

我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录进数据库.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值