JPA 表映射的自动列名生成

Posted

技术标签:

【中文标题】JPA 表映射的自动列名生成【英文标题】:Automatic Column name generation for JPA table mapping 【发布时间】:2021-10-11 06:59:50 【问题描述】:

我正在尝试使用@ManyToOne 和@OneToMany 映射实体表。映射列位于名为“internal_plan_id”的子表中。根据要求,我不能更改名称。下面是两个实体表: 父表

import java.sql.Timestamp;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@Setter
//@Data
@NoArgsConstructor
@Table(name = "financial_plan_details", schema = "financialplanadmin")
public class FinancialPlanDao 

  // This internalId is the primary key of the table.
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "internal_plan_id")
  private int internalId;

  // This stores the plan status into the database table.
  @Column(name = "plan_status")
  @Size(max = 10)
  private String planStatus;

  @Column(name = "presentation_file_key")
  @Size(max = 500)
  private String presentationFileKey;

  @Column(name = "create_timestamp")
  @NotNull
  private Timestamp createdTimestamp;

  @OneToMany(mappedBy = "financialPlan")
  private List<FinancialSubPlan> subPlans;

儿童桌:

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "financial_plan_subplan", schema = "financialplanadmin")
@JsonInclude(Include.NON_NULL)
public class FinancialSubPlan 

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "subplan_id")
  private int subPlanId;
  
  @Column(name = "external_subplan_id")
  private String externalSubplanId;

  @Column(name = "is_chosen")
  private Boolean subPlanIsChosen;
    
  @ManyToOne
  @JoinColumn(name = "internal_plan_id")
  private FinancialPlanDao financialPlan; 

我得到的错误是: 错误:关系“financial_plan_subplan”的“internal_plan_id_internal_plan_id”列不存在。

financial_subplan 中用于映射的现有列名是“internal_plan_id”。上面的名称“internal_plan_id_internal_plan_id”是自动生成的。那么有什么办法可以将其减少到只有“internal_plan_id”。

【问题讨论】:

恕我直言,您的映射是正确的。您能否显示导致错误的生成的 SQL 查询? 如果需要,可以覆盖Hibernate中的默认命名,请看baeldung.com/hibernate-naming-strategy。 【参考方案1】:

问题在于设置映射类的值。形成父类后的第一件事,就是将父类设置为子类,即subPlans.set(financialPlan)。然后我们必须将子类设置为父类,即financialPlan.set(List of subPlan)。我错过了将父母设置为孩子。

你也可以参考这个JPA / Hibernate One to Many Mapping Example with Spring Boot

在此您可以看到创建 Post 对象后,Comment 对象设置 Post 对象,之后 Post 对象设置评论对象,然后将其保存到数据库。

【讨论】:

以上是关于JPA 表映射的自动列名生成的主要内容,如果未能解决你的问题,请参考以下文章

JPA:@ManyToOne 关系的默认列名映射

JPA 实体映射

如何更改 JPA 生成的列名的默认格式

JPA 表继承和对象映射

JPA 选择查询以返回带有 @ManyToOne 映射的实体

HibernateMybatis与Spring Data JPA的区别