【问题标题】:Drop not null constraint for joinColumns in JoinTable删除 JoinTable 中 joinColumns 的非空约束
【发布时间】:2020-12-20 18:13:54
【问题描述】:

我有一个实体,依赖于哪个 hibernate 能够为 OneToMany-relations 生成连接表。

@Entity
public class RequestType extends EntityObject {
   @OneToMany(cascade = CascadeType.ALL)
   @JoinTable(name = "MType_MType", joinColumns = @JoinColumn(name = "mtype_id"), 
   inverseJoinColumns = @JoinColumn(name = "inner_request_types_id"))
   private List<LogicalInnerType> innerRequestTypes;
 }

@Entity
public class EntityObject {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EntityID")
  private Integer id;
 }

但是当我运行应用程序时,我收到以下异常:

PSQLException: EROOR: "inner_request_types_id" 列中的空值违反约束 NOT NULL

据我所知,任何 JoinColumn 都有一个默认为 nullable-parameter 的 true。

否则我怎么能放弃非空约束?

【问题讨论】:

  • 如果有空值,连接表的行应该是什么目的?
  • 在我看来,空值一开始就不应该存在。我会删除它们并保留约束
  • 你删除它们是什么意思?...

标签: java hibernate jpa


【解决方案1】:

是的,JoinColumn.nullable()的默认值为true

/** (Optional) Whether the foreign key column is nullable. */
boolean nullable() default true;

但这在这里无关紧要,因为nullable() 没有在@OneToMany 中检查@JoinColumn。 Hibernate 将始终向两个列添加 not null 约束,因为它希望始终存在一个拥有实体并且列表永远不会包含 null 值。

如果您想首先将 null 值添加到您的列表中(这不是错误),您应该考虑另一种选择。例如,您可以向RequestType 添加一个布尔属性,指示您希望使用null 值实现的状态。

顺便说一句,您的模型显然不正确。您使用的是List,但没有添加@OrderColumn。因此,Hibernate 无法确保任何顺序。如果你真的想存储一个特定的订单,你应该添加一个@OrderColumn 注释。或者你改用Set

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 2020-12-08
    • 2012-01-24
    • 2018-11-02
    • 1970-01-01
    • 2011-02-02
    • 2011-03-23
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多