JPA常用实体定义(1)-简单关系定义

本文介绍了使用JPA定义实体的方法,重点讲解了一对多(1-*)及多对一(*-1)关系的实体定义,包括实体类的属性注解、级联保存策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习使用JPA来定义实体,总结了一些常见的实体定义方式,以后便于快速开发时查询,以下提到的情况都经过了测试。

1、JPA方式的实体定义
一般的简单实体就不说了,只看*-1 (1-*)关系的实体定义。

One端实体AbstractObject的定义

@Entity
public class AbstractObject implements Serializable {
private static final long serialVersionUID = -6555909688667081217L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Integer id;
@Column
protected String name;
@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "obj")
private List<RelatedObj> relatedObjs;


@Id是必须的,用其标识实体的主键字段
@GeneratedValue属性先不介绍,后面介绍级联保存时再详细说明
@Column属性不用解释了吧,可以指定其name属性,当类的属性和表的映射名称不同时用
@OneToMany这个属性是为了设定通过1端获取*端的数据,即如例子中的AbstractObject中包含List<RelatedObj> relatedObjs属性,如果想通过程序AbstractObject.getRelatedObjs()遍历所有*端对象,就应该在1端设置@OneToMany,同时还应该包含List<RelatedObj> relatedObjs属性。但是可以不在1端维护*端的信息,对于这个例子,AbstractObject完全可以不定义List<RelatedObj> relatedObjs,同时也就不用设置@OneToMany了。如果设定了@OneToMany,有两个比较重要的属性,cascade,用于级联操作,mappedBy用于指定关联的*端是通过哪个属性关联到1端的。如下例,我们在*端RelatedObj实体中,是通过AbstractObject obj属性与AbstractObject建立关联的.除此以外,还可以指定fetch = FetchType.LAZY属性以延迟加载等。具体请查阅JPA文档。

Many端实体RelatedObj的定义

@Entity
public class RelatedObj {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@ManyToOne(cascade = { CascadeType.ALL })
private AbstractObject obj;


@ManyToOne属性在出现*-1或1-*关系时,在many端是必须定义的,因为他相当于数据库中建立的一个外键关联。@ManyToOne属性中的cascade属性是一个很常用的属性,用于级联操作,如当保存RelatedObj实体对象时,其关联的AbstractObject实体对象也会同时保存。如果不设置cascade属性,则级联保存时,会报object references an unsaved transient instance - save the transient instance before flushing异常。

这里我们来说明上文提到的@GeneratedValue属性。例子中RelatedObj设置了对AbstractObject实体对象的级联操作(cascade = {CascadeType.ALL}),当保存RelatedObj时,AbstractObject对象也会随之保存。对于数据库中已有的AbstractObject,我们取到这个abstractObject,然后设置relatedObj.setAbstractObject(abstractObject),保存relatedObj是不会 有问题的。但是如果没有设置AbstractObject对象的@GeneratedValue属性,并且abstractObject也是一个新建的对象时,由于其还没有持久化到数据库,因此其id属性是null,这时如果保存relatedObj,就会报ids for this class must be manually assigned before calling save()异常,原因就是abstractObject的id策略没有设置,hibernate不知道如何生成abstractObject的id,导致无法保存RelatedObj。

小结:
概念:
被操作实体:dao.save(obj),obj即为被操作实体
从属实体:如果obj关联了另一个实体,则另一个实体就是从属实体

1、级联保存时,从属实体需要设置id字段的@GeneratedValue属性,其strategy由GenerationType指定,如@GeneratedValue(strategy = GenerationType.AUTO)。
2、级联保存时,被操作实体应该设置cascade属性,其由CascadeType指定,如cascade = { CascadeType.ALL}
3、ManyToOne的一端必须设置。OneToMany一端则视情况而定,如果需要通过One端操作Many端,则应该设置。

其他实体间关系的定义还没有研究,但是应该差不多,以后有时间再测试学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值