最近学习使用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端,则应该设置。
其他实体间关系的定义还没有研究,但是应该差不多,以后有时间再测试学习。
分享到:
相关推荐
- **实体类**: 使用@Entity注解标记Java类为JPA实体,并通过@Id注解指定主键字段。 - **持久化操作**: 通过EntityManager的persist()方法将新实体持久化,merge()方法更新已存在的实体,remove()方法删除实体,find...
例如,`javax.persistence.EntityManager`是JPA的核心接口,负责管理持久化实体,包括创建、加载、保存和删除实体。`EntityManagerFactory`是它的工厂,负责实例化`EntityManager`。此外,`PersistenceUnit`和`...
1. **JPA简介**:Java Persistence API(JPA)是Java平台上的一个标准,由JSR 317定义,用于管理关系数据库中的数据。JPA提供了一种对象/关系映射(ORM)框架,将面向对象的程序设计与关系数据库的结构进行了解耦。 ...
1. Entity Manager:这是JPA的核心组件,负责管理实体的生命周期。源码中可以看到`EntityManagerFactory`和`EntityManager`的实现,它们分别用于创建和操作实体。`EntityManager`提供了诸如`persist()`, `merge()`, ...
1. `pom.xml`:Maven项目配置文件,定义了SpringBoot、JPA和Activiti的相关依赖。 2. `src/main/resources`:包含了配置文件(如application.properties)、流程定义XML文件(activiti流程图)等。 3. `src/main/...
它定义了一组API,允许开发者定义实体类、关系映射、事务控制等,而无需直接编写SQL语句。 2. **JPA配置** 在Java项目中,JPA的配置通常通过`pom.xml`文件引入依赖,如Spring Data JPA,然后在`application....
在JPA中,**关联关系**是实体之间的一种关系,模仿了数据库中的表间关系。有四种主要的关联类型: 1. **一对一(OneToOne)**: 表示两个实体之间存在唯一的关系,就像一个人只有一个身份证。配置时,可以使用`@...
Spring Boot简化了Spring应用程序的创建和配置过程,而JPA作为Java的ORM(对象关系映射)标准,允许开发者以面向对象的方式操作数据库。本文将深入探讨如何使用JPA和Spring Boot结合,实现代码自动生成工具,提高...
### JPA实体对象状态 #### 一、实体对象的状态分类 在Java Persistence API (JPA) 中,实体对象的状态管理是实现数据持久化的基础之一。根据实体对象与实体管理器(EntityManager)之间的交互关系,实体对象可以...
本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...
1. **实体定义** JPA中的核心是实体(Entity),它代表数据库表中的一个记录。在Java类中,通过`@Entity`注解来标记一个类为实体。例如: ```java @Entity public class User { @Id private Long id; private...
3. 配置JPA:声明实体管理工厂、事务管理器等,定义实体扫描路径。 4. 创建实体类:定义与数据库表对应的Java类,使用注解如@Entity、@Table等。 5. 创建Repository接口:Spring Data JPA会自动为这些接口生成实现,...
JPA通过定义实体类(Entity)和注解,将对象模型与关系数据模型进行映射,从而实现了ORM。 Hibernate JPA 2.1 API是Hibernate组织对JPA 2.1规范的具体实现,它为开发者提供了更强大、更灵活的持久化机制。1.0.0....
1. **配置文件**:设置SpringMVC、Hibernate JPA和Spring Data JPA的相关配置,如数据源、实体扫描路径、JPA配置等。 2. **实体类**:定义与数据库表对应的实体类,包含属性和注解。 3. **Repository接口**:定义...
通过这些注解,我们可以定义实体类与数据库表之间的映射关系。 #### 二、`@Table` 注解详解 `@Table`注解被用来标识一个实体类对应于哪个数据库表。它是定义在实体类级别上的,通常放在类声明之前。该注解包含了一...
通过分析提供的文件“JPA关系”,我们可以深入学习如何在代码中实现这些关系,包括实体的定义、注解的使用以及关联的查询方法。这将帮助我们更好地理解和掌握JPA在处理对象关系映射时的灵活性和实用性。
JPA可以通过注解或XML文件获取实体的元数据信息,例如字段、关系等。`schemas`目录可能包含这些元数据定义。 6. **事务管理(Transaction Management)**: JPA支持容器管理事务(CMT)和应用程序管理事务(BMT)...
- 利用 `@ManyToOne`、`@OneToMany`、`@ManyToMany` 等注解来定义实体之间的关系,Spring-data-jpa 支持多种关系类型的映射。 #### 四、Spring-data-jpa 复杂查询支持 除了基本的 CRUD 操作外,Spring-data-jpa ...
1. **Repository 组件**:定义了一种契约,允许开发者通过简单的接口定义存储库行为,而无需编写具体的实现代码。例如,`CrudRepository` 接口提供了基本的 CRUD(创建、读取、更新、删除)操作。 2. **Query ...