英文:
Drop not null constraint for joinColumns in JoinTable
问题
我有一个实体,依靠它,Hibernate可以为OneToMany关系生成联接表。
@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: 错误:列"inner_request_types_id"中的空值违反了非空约束条件
据我所知,任何JoinColumn的默认nullable参数为true。
我应该如何删除非空约束?
英文:
I have an entity, leaning on which hibernate able to generate join table for 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;
}
But when I run application, I receive the following exception:
>PSQLException: EROOR: null value in column "inner_request_types_id" violate constraint NOT NULL
As I know, any JoinColumn has a default true of nullable-parameter.
How could I otherwise drop notnull-constraint?
答案1
得分: 1
是的,JoinColumn.nullable()
的默认值是 true
:
/** (可选)外键列是否可为 null。 */
boolean nullable() default true;
但是在这里这不相关,因为在 @OneToMany
中不会检查 @JoinColumn
的 nullable()
。Hibernate 总是会为两个列添加 not null 约束,因为它期望始终存在一个拥有的实体,并且该列表永远不包含 null 值。
如果您想要首先在列表中添加 null
值(并且这不是错误),您应该考虑一种替代方案。例如,您可以为 RequestType
添加一个布尔属性,指示您希望通过 null
值实现的状态。
顺便提一下,您的模型中还有另一件事情,显然是不正确的。您使用了一个 List
,但是您没有添加 @OrderColumn
。因此,Hibernate 无法确保任何顺序。如果您确实希望存储特定的顺序,您应该添加 @OrderColumn
注解。或者您可以改用 Set
。
英文:
Yes, the default value of JoinColumn.nullable()
is true
:
/** (Optional) Whether the foreign key column is nullable. */
boolean nullable() default true;
But this is not relevant here, because nullable()
is not inspected for @JoinColumn
in a @OneToMany
. Hibernate will always add a not null constraint to both columns, because it expects that there is always an owning entity and that the list never contains null values.
If you wanted to add null
values to your list in the first place (and this is not a mistake), you should think about an alternative. For example you could add a boolean attribute to RequestType
that indicates the state that you wanted to achieve with the null
value.
By the way there is another thing, that is apparently not correct in your model. You are using a List
, but you add no @OrderColumn
. As a result Hibernate has no possibility to ensure any order. If you really want to store a specific order, you should add an @OrderColumn
annotation. Or you use a Set
instead.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论