JPA表关联的方式@ManyToOne@JoinColumn

1.@ManyToOne 和JoinColumn的使用方案1

网上很多教程都没有History.tableBeId这个成员变量

@Entity
@Table(name = "history")
@org.hibernate.annotations.Table(appliesTo = "history",comment="历史记录")
@ApiModel(value="历史记录", description="历史记录")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class History {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty("唯一编号")
    private Long historyId;
    
    @ApiModelProperty("table_be_id")
    @Column(name="table_be_id",columnDefinition = "bigint(20) comment 'TableBeid'")
    private Long tableBeId;
    
    @ManyToOne
    @JoinColumn(name="table_be_id", referencedColumnName = "table_be_id",insertable=false,updatable=false)
    private TableBe tableBe;
}

@Entity
@Table(name = "TableBe")
@org.hibernate.annotations.Table(appliesTo = "TableBe",comment="TableBe")
@ApiModel(value="TableBe", description="TableBe")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableB  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty("唯一编号")
    @Column(name="table_be_Id",columnDefinition = "bigint(20) comment 'TableBeid'")
    private Long tableBeId;
}

2.@ManyToOne 和JoinColumn的使用方案2

差别就是没History.tableBeId这个成员变量

@Entity
@Table(name = "history")
@org.hibernate.annotations.Table(appliesTo = "history",comment="历史记录")
@ApiModel(value="历史记录", description="历史记录")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class History {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty("唯一编号")
    private Long historyId;
    
  
    
    @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL,optional=true)//多个用户对应一个角色
@JoinColumn(name="table_be_id",insertable=false,updatable=false)
    private TableBe tableBe;
}

3.注解帮助文档

@ManyToOne

属性必需说明

ManyToOne (Java EE 6 )

javax.persistence.ManyToOne - JPA annotation

 CascadeType[]

cascade

          (可选)必须级联到关联目标的操作。

 FetchType

fetch

          (可选)关联是应该延迟加载还是必须急切获取。

 boolean

optional

          (可选)关联是否可选。

 java.lang.Class

targetEntity

          (可选)作为关联目标的实体类。

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。



备注:optional=true 相当于 left join 允许返回NULL, optional=false 相当于 inner join

@JoinColumn 不再多说参考结构文档说明

JoinColumn (Java EE 6 )

javax.persistence.JoinColumn - JPA annotation

 java.lang.String

columnDefinition

          (可选)为列生成 DDL 时使用的 SQL 片段。

 boolean

insertable

          (可选)该列是否包含在持久性提供程序生成的 SQL INSERT 语句中。

 java.lang.String

name

          (可选)外键列的名称。

 boolean

nullable

          (可选)外键列是否可以为空。

 java.lang.String

referencedColumnName

          (可选)此外键列引用的列的名称。

 java.lang.String

table

          (可选)包含该列的表的名称。

 boolean

unique

          (可选)该属性是否是唯一键。

 boolean

updatable

          (可选)该列是否包含在持久性提供程序生成的 SQL UPDATE 语句中。

4.关于Spring JPA不想使用外键

关于Spring JPA不想使用外键的同学@ForeignKey_丑熊君的博客-CSDN博客_foreignkey jpa

5.A referencing B not mapped to a single property

这是双主键的问题。@id 有两个就会有这个问题

方案一:去掉一个(有些时候真的是写多了)

方案二:

A referencing B not mapped to a single property_chenxie2031的博客-CSDN博客

6.参考文献

Hibernate 多表关联 @ManyToOne_MR_WRONG_Man的博客-CSDN博客

springboot jpa外键 (user role)双向多对多@ManyToMany(原创)_HD243608836的博客-CSDN博客_jpa自动生成外键

关于Spring JPA不想使用外键的同学@ForeignKey_丑熊君的博客-CSDN博客_foreignkey jpa

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值