首页 > 其他分享 >@OneToMany and @OneToOne

@OneToMany and @OneToOne

时间:2023-05-10 12:32:42浏览次数:53  
标签:层叠 OneToOne OneToMany 实体 持续性 目标 拥有 关联



@OneToMany and @OneToOne


@OneToMany

默认情况下,JPA 为具有一对多多重性的多值关联定义一个 OneToMany 映射。

使用 @OneToMany 批注:

将获取类型配置为 LAZY

由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体

配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标

配置持续性提供程序对单向一对多关系使用的连接表(请参阅 @JoinTable)的详细信息

表 1-29 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-29 @OneToMany 属性


cascade

可选



默认值:CascadeType 的空数组。

默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。

如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括:

ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。

MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。

PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。

REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。

REMOVE - 如果删除了拥有实体,则还删除关联的目标。

fetch

可选

默认值:FetchType.EAGER。

默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。

如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。

mappedBy

可选



默认值:如果关系是单向的,则该持续性提供程序确定拥有该关系的字段。

如果关系是双向的,则将关联相反(非拥有)方上的 mappedBy 元素设置为拥有此关系的字段或属性的名称(如示例 1-62 所示)。

targetEntity

可选



默认值:使用一般参数定义的 Collection 的参数化类型。

默认情况下,如果使用通过一般参数定义的 Collection,则持续性提供程序从被引用的对象类型推断出关联的目标实体。

如果 Collection 不使用一般参数,则必须指定作为关联目标的实体类:将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。



示例 1-61 和示例 1-62 显示了如何使用此批注在使用一般参数的 Customer(被拥有方)和 Order(拥有方)之间配置一个一对多映射。

示例 1-61 @OneToMany - 使用一般参数的 Customer 类

@Entity

public class Customer implements Serializable {
 
...
 
@OneToMany(cascade=ALL, mappedBy="customer")
 
public Set<Order> getOrders() { 
 
return orders; 
 
}
 
...
 
}


示例 1-62 @ManyToOne - 使用一般参数的 Order 类

@Entity


public class Customer implements Serializable {
 
...
 
@ManyToOne
 
@JoinColumn(name="CUST_ID", nullable=false)
 
public Customer getCustomer() {
 
return customer;
 
}
 
...
 
}

 


@OneToOne


默认情况下,JPA 为指向另一个具有一对一多重性的实体的单值关联定义一个 OneToOne 映射,并从被引用的对象类型推断出关联的目标实体。

使用 @OneToOne 批注:

将获取类型配置为 LAZY

如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)

配置关联的目标实体(如果无法从被引用的对象类型推断出它)

配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标

表 1-30 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-30 @OneToOne 属性



cascade

可选



默认值:空 CascadeType 数组。

默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。

如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括:

ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。

MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。

PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。

REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。

REMOVE - 如果删除了拥有实体,则还删除关联的目标。

fetch

可选

默认值:FetchType.EAGER。

默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。

如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。

mappedBy

可选


默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体

如果持续性提供程序无法推断关联的目标实体,则将关联的相反(非拥有)方上的 mappedBy 元素设置为拥有此关系的字段或属性的 String 名称(如示例 1-64)所示。

optional

可选


默认值:true。

默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。

如果这并不适合于您的应用程序,请将 optional 设置为 false。

targetEntity

可选



默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体

如果持续性提供程序无法推断出目标实体的类型,则将关联的拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。



示例 1-63 和示例 1-64 显示了如何使用此批注在 Customer(拥有方)和 CustomerRecord(被拥有方)之间配置一个一对一映射。

示例 1-63 @OneToOne - Customer 类

@Entity


public class Customer implements Serializable {
 
...
 
@OneToOne(optional=false)
 
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false)
 
public CustomerRecord getCustomerRecord() { 
 
return customerRecord; 
 
}
 
...
 
}


示例 1-64 @OneToOne - CustomerRecord 类

@Entity

public class CustomerRecord implements Serializable {
 
...
 
@OneToOne(optional=false, mappedBy="customerRecord")
 
public Customer getCustomer() {
 
return customer;
 
}
 
...
 
}

@ManyToOne

默认情况下,JPA 为指向具有多对一多重性的其他实体类的单值关联自动定义一个 ManyToOne 映射。

使用 @ManyToOne 批注:

将获取类型配置为 LAZY

如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)

配置关联的目标实体(如果无法从被引用的对象类型推断出它)

配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标

表 1-23 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-23 @ManyToOne 属性





cascade

可选



默认值:CascadeType 的空数组。

默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。

如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括:

ALL — 针对拥有实体执行的任何持续性操作均层叠到关联的目标。

MERGE — 如果合并了拥有实体,则将 merge 层叠到关联的目标。

PERSIST — 如果持久保存拥有实体,则将 persist 层叠到关联的目标。

REFRESH — 如果刷新了拥有实体,则 refresh 为关联的层叠目标。

REMOVE — 如果删除了拥有实体,则还删除关联的目标。

fetch

可选



默认值:FetchType.EAGER。

默认情况下,JPA 持续性提供程序使用获取类型 EAGER:这将要求持续性提供程序运行时必须迫切获取数据。

如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:这将提示持续性提供程序在首次访问数据(如果可以)时应不急于获取数据。

optional

可选



默认值:true。

默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。

如果这并不适合于您的应用程序,请将 optional 设置为 false。

targetEntity

可选



默认值:JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体

如果持续性提供程序无法推断出目标实体的类型,则将关联拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。



示例 1-49 显示了如何使用此批注在使用一般参数的 Customer(被拥有方)和 Order(拥有方)之间配置一个多对一映射。

示例 1-49 @ManyToOne

@Entity


public class Order implements Serializable {
 
...
 
@ManyToOne(optional=false)
 
@JoinColumn(name="CUST_ID", nullable=false, updatable=false)
 
public Customer getCustomer() {
 
return customer;
 
}
 
...
 
}


标签:层叠,OneToOne,OneToMany,实体,持续性,目标,拥有,关联
From: https://blog.51cto.com/u_16034393/6260994

相关文章

  • Django笔记七之ManyToMany和OneToOne介绍
    ManyToMany是一种多对多的关系,在用途和使用方法上和外键ForeignKey类似。以下是本篇笔记的目录:ManyToMany的介绍through参数through_fields参数ManyToMany关系......
  • OneToMany字段序列化 failed to lazily initialize a collection of role
    hibernate项目中,如果要对onetomany的pojo对象中的字段序列化,则会抛failedtolazilyinitializeacollectionofrole错误。  解决方法1:目前我是用Jackson中的@JsonIgnor......
  • 022.OneToMany对象关联查询(多表级联查询)
    1.案例分析1.班级(1)--->学生(n)学生必须持有班级的外键2.1对1通过主键关联3.多对多必须单独抽象出一张中间表  2.商品和详情对象关联查询(一对多)2.1创建商品......
  • freeSql一对多 oneToMany实例
    一:公司publicpartialclassItemCompanyEntity:EntityFull{  ///<summary>  ///工程ID  ///</summary>  [Column(StringLength=20)]  pub......
  • hibernate的OneToMany映射
    hibernate的OneToMany和ManyToOne映射1、前言在数据库中,不管一对多或者多对一都统称为:一对多。@OneToMany和@ManyToOne指定了一对多的关系。2、@OneToMany使用外键映射......
  • hibernate的OneToOne映射
    hibernate的OneToOne映射1、前言@OneToOne注解可以建立实体bean之间的一对一的关联。一对一关联有四种情况:一是关联的实体都共享同样的主键;二是其中一个实体通过外键......