gpt4 book ai didi

mysql - @UniqueConstraint 可空字段

转载 作者:行者123 更新时间:2023-11-30 23:10:12 25 4
gpt4 key购买 nike

我有一个 Product 实体,它的 namecategory 组合对于每个产品都应该是唯一的。

在我的例子中,name 是必需的,但 category 可能不存在。

Product 定义如下:

@Entity
@Table(
uniqueConstraints=
@UniqueConstraint(columnNames={"name", "category")
)
public class Product {

// ...

@NotNull
@Size(min = 1, max = 64)
private String name;

@ManyToOne(fetch = FetchType.EAGER)
private ProductCategory category;

// ...

}

...但约束仅在类别不是 NULL 时才有效。

换句话说,我不能坚持(这没关系)实体:

name="example", category=1
name="example", category=1

...同时我可以坚持(这不是我想要的)实体:

name="example", category=null
name="example", category=null

所以,我的问题是 - 如何为字段组合实现唯一约束,其中一个字段可以为空(NULL 被视为任何其他值)?

PS:我使用 Hibernate 作为 JPA 提供程序和 MySQL 数据库。

最佳答案

@UniqueConstraints 注释应该可以完成这项工作。检查the documentation举个例子。此外,如果该表是自动生成的,您可能会考虑删除该表,具体取决于您在 persistence.xml 文件中设置架构的自动生成方式。

更新当然,您必须指定两列(而不是您指定的字段):

@UniqueConstraint(columnNames={"name", "category_id")//or check the name of the column in the db for category

更新 2因为问题实际上在 mysql 中,所以您可以将其他两个持久字段插入到您的实体中:

@Column(columnName="category", insertable=false, updatable=false)//map to the same column used for your category
private Long categoryId;//I suppose it is a Long.

@Column(columnName="categoryIdConstraint")//
private long categoryIdConstraint;//this is not nullable. If categoryId is null, then simply put 0 or -1

//and now synchronize the categoryIdConstraint field with entity listeners
//and add the @UniqueConstraint over "name" and "categoryIdConstraint" (which now cannot be null.)

关于mysql - @UniqueConstraint 可空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com