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
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 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了,这样就可以防止一个空的身份证记录进数据库.
@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 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了,这样就可以防止一个空的身份证记录进数据库.
相关文章推荐
- JPA关系映射系列二:one-to-one主键关联
- jpa单向一对一关系外键映射
- JPA总结——实体关系映射(一对多@OneToMany)
- JPA关系映射
- JPA关系映射之one-to-one
- JPA2.0学习笔记---对象/关系映射增强详解
- JPA关系映射
- JPA关系映射系列三:one-to-many和many-to-one
- JPA总结——实体关系映射(一对多@OneToMany)
- Hibernate之jpa实体映射的三种继承关系
- JPA实体关系映射之注释
- JPA关系映射系列三:one-to-many和many-to-one
- JPA关系映射
- JPA的七种映射关系
- 对Jpa中Entity关系映射中mappedBy的理解
- JPA关系映射系列三:one-to-many和many-to-one
- jpa关系映射
- JPA对象关系映射——访问实体状态
- JPA实体继承关系的映射策略
- EJB3 jpa 数据库表的映射关系