您的位置:首页 > 其它

JPA关系映射

2013-05-17 13:25 429 查看
@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
class
Exam 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 a 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.数据持久化存储



需要注意的是,在持久化存储时,我们只需要对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了,这样就可以防止一个空的身份证记录进数据库.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: