`
soartju
  • 浏览: 248511 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
最近学习使用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端,则应该设置。

其他实体间关系的定义还没有研究,但是应该差不多,以后有时间再测试学习。
0
0
分享到:
评论

相关推荐

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    - **实体类**: 使用@Entity注解标记Java类为JPA实体,并通过@Id注解指定主键字段。 - **持久化操作**: 通过EntityManager的persist()方法将新实体持久化,merge()方法更新已存在的实体,remove()方法删除实体,find...

    hibernate-jpa-2.1-api-1.0.0.Final.jar

    例如,`javax.persistence.EntityManager`是JPA的核心接口,负责管理持久化实体,包括创建、加载、保存和删除实体。`EntityManagerFactory`是它的工厂,负责实例化`EntityManager`。此外,`PersistenceUnit`和`...

    hibernate-jpa-2.0-api-1.0.1.Final-sources

    1. **JPA简介**:Java Persistence API(JPA)是Java平台上的一个标准,由JSR 317定义,用于管理关系数据库中的数据。JPA提供了一种对象/关系映射(ORM)框架,将面向对象的程序设计与关系数据库的结构进行了解耦。 ...

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip

    1. Entity Manager:这是JPA的核心组件,负责管理实体的生命周期。源码中可以看到`EntityManagerFactory`和`EntityManager`的实现,它们分别用于创建和操作实体。`EntityManager`提供了诸如`persist()`, `merge()`, ...

    springboot-jpa-activiti-bootstrap-master

    1. `pom.xml`:Maven项目配置文件,定义了SpringBoot、JPA和Activiti的相关依赖。 2. `src/main/resources`:包含了配置文件(如application.properties)、流程定义XML文件(activiti流程图)等。 3. `src/main/...

    jpa的学习---jpa demo工程

    它定义了一组API,允许开发者定义实体类、关系映射、事务控制等,而无需直接编写SQL语句。 2. **JPA配置** 在Java项目中,JPA的配置通常通过`pom.xml`文件引入依赖,如Spring Data JPA,然后在`application....

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    在JPA中,**关联关系**是实体之间的一种关系,模仿了数据库中的表间关系。有四种主要的关联类型: 1. **一对一(OneToOne)**: 表示两个实体之间存在唯一的关系,就像一个人只有一个身份证。配置时,可以使用`@...

    jpa代码自动生成工具-springboot

    Spring Boot简化了Spring应用程序的创建和配置过程,而JPA作为Java的ORM(对象关系映射)标准,允许开发者以面向对象的方式操作数据库。本文将深入探讨如何使用JPA和Spring Boot结合,实现代码自动生成工具,提高...

    JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作

    ### JPA实体对象状态 #### 一、实体对象的状态分类 在Java Persistence API (JPA) 中,实体对象的状态管理是实现数据持久化的基础之一。根据实体对象与实体管理器(EntityManager)之间的交互关系,实体对象可以...

    JPA学习笔记-EJB-04JPA关联映射总结

    本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...

    JPA基础语法资料--JPA_Basic

    1. **实体定义** JPA中的核心是实体(Entity),它代表数据库表中的一个记录。在Java类中,通过`@Entity`注解来标记一个类为实体。例如: ```java @Entity public class User { @Id private Long id; private...

    Spring集成JPA和MyBatis简单例子-20170622

    3. 配置JPA:声明实体管理工厂、事务管理器等,定义实体扫描路径。 4. 创建实体类:定义与数据库表对应的Java类,使用注解如@Entity、@Table等。 5. 创建Repository接口:Spring Data JPA会自动为这些接口生成实现,...

    hibernate-jpa-2.1-api-1.0.0.draft-6-sources

    JPA通过定义实体类(Entity)和注解,将对象模型与关系数据模型进行映射,从而实现了ORM。 Hibernate JPA 2.1 API是Hibernate组织对JPA 2.1规范的具体实现,它为开发者提供了更强大、更灵活的持久化机制。1.0.0....

    SpringMVC +Hibernate JPA+Spring-data-jpa实例

    1. **配置文件**:设置SpringMVC、Hibernate JPA和Spring Data JPA的相关配置,如数据源、实体扫描路径、JPA配置等。 2. **实体类**:定义与数据库表对应的实体类,包含属性和注解。 3. **Repository接口**:定义...

    JPA学习笔记-EJB-02JPA属性注解

    通过这些注解,我们可以定义实体类与数据库表之间的映射关系。 #### 二、`@Table` 注解详解 `@Table`注解被用来标识一个实体类对应于哪个数据库表。它是定义在实体类级别上的,通常放在类声明之前。该注解包含了一...

    JPA常用关系实现例子

    通过分析提供的文件“JPA关系”,我们可以深入学习如何在代码中实现这些关系,包括实体的定义、注解的使用以及关联的查询方法。这将帮助我们更好地理解和掌握JPA在处理对象关系映射时的灵活性和实用性。

    JPA源代码(persistence-api)

    JPA可以通过注解或XML文件获取实体的元数据信息,例如字段、关系等。`schemas`目录可能包含这些元数据定义。 6. **事务管理(Transaction Management)**: JPA支持容器管理事务(CMT)和应用程序管理事务(BMT)...

    Spring-data-jpa常用教程.pdf

    - 利用 `@ManyToOne`、`@OneToMany`、`@ManyToMany` 等注解来定义实体之间的关系,Spring-data-jpa 支持多种关系类型的映射。 #### 四、Spring-data-jpa 复杂查询支持 除了基本的 CRUD 操作外,Spring-data-jpa ...

    spring-data-commons-1.7.2.RELEASEspring-data-jpa-1.5.2.RELEASE-java datajpa

    1. **Repository 组件**:定义了一种契约,允许开发者通过简单的接口定义存储库行为,而无需编写具体的实现代码。例如,`CrudRepository` 接口提供了基本的 CRUD(创建、读取、更新、删除)操作。 2. **Query ...

Global site tag (gtag.js) - Google Analytics