JPA常用实体定义(1)-简单关系定义
最近学习使用JPA来定义实体,总结了一些常见的实体定义方式,以后便于快速开发时查询,以下提到的情况都经过了测试。
1、JPA方式的实体定义
一般的简单实体就不说了,只看*-1 (1-*)关系的实体定义。
One端实体AbstractObject的定义
@Entitypublic class RelatedObj {@Id@GeneratedValue(strategy = GenerationType.AUTO) private Integer id;@Columnprivate 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端,则应该设置。
其他实体间关系的定义还没有研究,但是应该差不多,以后有时间再测试学习。