@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 {
}
Cascade 级联操作
CascadeType. PERSIST 级联持久化 ( 保存 ) 操作
CascadeType. MERGE 级联更新 ( 合并 ) 操作
CascadeType. REFRESH 级联刷新操作,只会查询获取操作
CascadeType. REMOVE 级联删除操作
CascadeType. ALL 级联以上全部操作
Fetch 抓取是否延迟加载,默认情况一的方为立即加载,多的一方为延迟加载
mappedBy 关系维护
mappedBy= "exam" 表示在ExamUserAns 类中的 exam 属性来维护关系,这个名称必须和ExamUserAns中的exam属性名称完全一致才行。
另外需要注意,Exam类中的集合类型必须是List或者Set,不能设置为ArrayList,否则会报错
Illegal
2.考试答案类
@Entity
public class ExamUserAns implements Serializable {
//get and set method here ……
}
3.数据持久化存储
需要注意的是,在持久化存储时,我们只需要对Exam类进行merge或者persist即可,JPA会自动将其集合关联类进行持久化存储,而不需要我们对ExamUserAns再执行persist方法,但是我们需要设置examUserAns.setExam(exam)来维护这种关联。
对于mappedBy复习下:
人跟身份证双向关联
在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了,这样就可以防止一个空的身份证记录进数据库.