jpa 外键 查询结果只有id_JPA学习笔记

目录

目录 1

一、JPA基础 2

1.1 JPA基础 2

1.2JPA开发过程 3

1.3 实体的生命周期及实体管理器常用方法 4

二、环境搭建 5

2.1 添加JPA支持 6

2.2 添加配置文件 6

2.3测试配置 6

2.4 环境搭建附表 6

三、常用注解 12

3.1 批注完全参考 12

3.2 ID相关的 12

3.3主键生成策略 13

3.4字段、添加字段、添加表关联 13

3.5映射相关 14

3.6其他 14

四、JPA映射 14

4.1一对一映射 15

4.1.1共享主键映射 15

4.1.2关联外键映射 17

4.1.3添加表关联 17

4.2一对多关联 18

4.2.1添加字段的一对多、多对一关联 18

4.2.2添加表的一对多、多对一关联 19

4.3多对多关联 20

4.4继承映射 21

五、JPQL 21

六、常见异常 22

一、JPA基础

1.1 JPA基础

JPA: java persistence api 支持XML、JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范

元数据:对象和表之间的映射关系

实体: entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字

游离状态实体以值方式进行传递,需要serializable

JPA是一套规范、有很多框架支持(如Hibernate3.2以上、Toplink,一般用Hibernate就行 oracle可以用toplink)

JPQL

1、与数据库无关的,基于实体的查询语言

2、操作的是抽象持久化模型

3、JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型

4、EJBQL的扩展

5、支持projection(可以查询某个实体的字段而不需要查询整个实体)、批量操作(update、delete)、子查询、join、group by having(group by聚合后 having 聚合函数 比较 条件)

弱类型语言:没有明显的类型、根据情况变化、容易出错

强类型语言:没个变量都有固定的类型。不容易出错

虽然JPA规范中明确表示无法访问一个集合关系字段

抽象模型类型:JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型

状态字段

关联字段

查询多个字段查出来的是个对象值数组

1.2JPA开发过程

JPA配置文件声明持久化单元 --> 配置文件persistence.xml

编写带标注的实体类

编写Dao类

xml配置

事务类型分为:RESOURCE_LOCAL

本地事务、JTA(java事务API)

注解

@Entity  将JavaBean标注为一个实体 name属性

@Table  数据库中的表,name名称、catalog数据库名 @Secondary Table/@Secondary Tables多个表

@Id   定义了实体的主键信息

@GeneratedValue逐渐省城策略

@GeneratedValue(Strategy = GenerationType.SEQUENCE)

@SequenceGenerator(name="SEQ_TEST",sequenceName="User_SEQ",allocationSize=25)

@column  属性、字段对应的表字段

@Temporal 属性是时间类型的话可以细分

DATE  java.sql.Date

TIME  java.sql.Time

TIMESTAMP java.sql.Timestamp

@Lob  标注CLOB、BLOB

@Base 是否延迟加载@Base(fetch = FETCHTYPE.LAZY/FETCHTYPE.EAGER)

@Transient 实体bean中,所有非static、非transient状态变量、字段都要被持久化

如果有字段、变量在数据库中没有对应,标注为transient就可以不被持久化

标注方式: 标注在字段上

标注在变量上

实体类写法:

1、必须有无参的构造函数

2、没有final类型的变量或方法

3、不可以是public类型的,只能通过get、set方法读写

管理实体

Persistence

EntityManagerFactory

EntityManager

Persistence.createEntityManagerFactory('persistence.xml中配置的persistence unit').createEntityManager()获取EntityManager

1.3 实体的生命周期及实体管理器常用方法

EntityManager声明周期    Java对象   实体管理器    数据库

1、 新实体(new)     存在    不存在     不存在

2、持久化实体(managed)   存在    存在     存在

3、分离的实体(detached)   不存在    不存在     存在

4、删除的实体(removed)   存在    存在     不存在

new

↓persist()

find()  ↓  commit()、clear()

DB  → → → → → → managed  → → → → → → detached

↓   ←merge()

↓remove()

removed

常用方法

1、persist(Object)       持久化

2、remove(Object)       删除对象

3、find(Class entityClass,Object key)  根据主键查询

4、flush()         实体与底层同步,执行sql

5、createQuery()       创建JPQL查询对象

5、createNativeQuery()      根据普通SQL查询

5、createNamedQuery()      命名查询@NamedQuerie标注

5、merge(Object)       将一个detached的实体持久化到EntityManager中

5、close()         关闭管理器

———————————————————————————————————————

javax.persistence.Query

int executeUpdate()   执行更新、删除、添加

Object getSingleResult() 执行查询(返回一条记录)

List getResultList()  执行查询(返回结果链表)

Query setParameter(int position,object value) 给Query对象设置参数

Query setMaxResults(int maxResult)    给Query对象设置返回数

Query setFirstResult(int firstResult)  给Query对象设置返回偏移

参数查询(只能用一种)

命名参数查询 "select u from User where id = :uid";  setParameter("uid",value);

位置参数查询

------------------------------------------------------------

Person person = em.find(Person.class,1);

//相当于Hibernate的get

Person person = em.getReference(Person.class,1);

//相当于Hibernate的load返回一个代理对象

//注意延迟加载时的 事务没关闭的时候才好用

find 如果找不到返回的是个null,这时候下面在调用null的方法报nullpoint异常

reference相当于延迟加载  如果找不到,会在第一次使用就报EntityNotFound异常

回调函数(相当于拦截器,下面的方法执行前后调用指定的方法)

@Prepersist

@PostPersist

@PreRemove

@PostRemove

@PreUpdate

@PostUpdate

@PostLoad    载入实体时(find、查询、refresh)

-----------------------------------------------------------------

二、环境搭建

2.1 添加JPA支持

1、准备JPA用到的jar包(JPA支持包)

2、window → preferences → Java → BuildPath → User Libraries

→new  User Library

→Add  Jars

3、项目   →

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Data JPA中,可以通过继承`JpaRepository`接口来获得外键相关的信息。 首先,确保你的实体类(Entity Class)之间有正确的关联关系,并且在定义关联关系时使用了JPA注解,如`@OneToOne`、`@OneToMany`、`@ManyToOne`、`@ManyToMany`等。 然后,在定义Repository接口时,继承`JpaRepository`接口,并添加相应的泛型参数,如下所示: ```java import org.springframework.data.jpa.repository.JpaRepository; public interface YourEntityRepository extends JpaRepository<YourEntity, Long> { // 在这里可以定义自定义的查询方法 } ``` 在上述示例中,`YourEntity`是你的实体类,`Long`是实体类的主键类型。通过继承`JpaRepository`接口,你将获得一组常用的CRUD操作方法,包括获取外键相关的信息。 使用`JpaRepository`接口提供的方法,你可以轻松地进行查询操作,包括根据外键进行查询、获取关联实体等。例如,你可以使用以下方法来获取指定实体的关联实体: ```java YourEntity yourEntity = yourEntityRepository.findById(id).orElse(null); RelatedEntity relatedEntity = yourEntity.getRelatedEntity(); ``` 在上述示例中,我们首先通过`findById()`方法查询到具体的实体对象`yourEntity`,然后通过实体对象的方法(根据关联关系的命名规则)获取到关联的实体对象`relatedEntity`。 需要注意的是,具体的方法名称和用法可能会根据你的实体类和关联关系的具体定义而有所不同。在使用`JpaRepository`时,你可以根据需要自定义查询方法,以满足你的特定业务需求。 总之,通过继承`JpaRepository`接口,你可以轻松地获取外键相关的信息,并进行相关的查询操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值