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
属性必需说明
javax.persistence.ManyToOne – JPA annotation
(可选)必须级联到关联目标的操作。 |
|
(可选)关联是应该延迟加载还是必须急切获取。 |
|
boolean |
(可选)关联是否可选。 |
java.lang.Class |
(可选)作为关联目标的实体类。 |
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 不再多说参考结构文档说明
javax.persistence.JoinColumn – JPA annotation
java.lang.String |
(可选)为列生成 DDL 时使用的 SQL 片段。 |
boolean |
(可选)该列是否包含在持久性提供程序生成的 SQL INSERT 语句中。 |
java.lang.String |
(可选)外键列的名称。 |
boolean |
(可选)外键列是否可以为空。 |
java.lang.String |
(可选)此外键列引用的列的名称。 |
java.lang.String |
(可选)包含该列的表的名称。 |
boolean |
(可选)该属性是否是唯一键。 |
boolean |
(可选)该列是否包含在持久性提供程序生成的 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