gpt4 book ai didi

java - JPA:如何表达包含@ElementCollection 列的唯一约束?

转载 作者:搜寻专家 更新时间:2023-11-01 01:44:43 27 4
gpt4 key购买 nike

这是我的 JPA 实体类:

@Cacheable
@Entity
public class JpaItemSearchRequest implements ItemSearchRequest {

@Id
@GeneratedValue
private long id;

@Enumerated(EnumType.STRING)
private SearchIndex searchIndex;

private String browseNode;
private String keywords;

@Enumerated(EnumType.STRING)
@ElementCollection
private Set<ResponseGroup> responseGroups = new HashSet<ResponseGroup>();

private int itemPage;

@Enumerated(EnumType.STRING)
private Locale locale;

... end of fields ...
}

SearchIndex , ResponseGroup , 和 Locale是枚举。

这个类有一个相当复杂的唯一约束: (searchIndex, browseNode, keywords, responseGroups, itemPage, locale)被认为是独一无二的。

所以我在类中添加了如下约束注解:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "searchIndex", "browseNode", "keywords", "responseGroups", "itemPage", "locale" }) })

当我尝试练习我的类(class)时,出现以下异常:

 org.hibernate.AnnotationException: Unable to create unique key constraint (searchIndex, browseNode, keywords, responseGroups, itemPage, locale) on table JpaItemSearchRequest: database column responseGroups not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types)
at org.hibernate.cfg.Configuration.buildUniqueKeyFromColumnNames(Configuration.java:1584) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1386) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94) ~[hibernate-entitymanager-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) ~[hibernate-entitymanager-4.1.7.Final.jar:4.1.7.Final]
... 74 common frames omitted

(我使用 Hibernate 4.1.7.Final 作为 JPA 实现/服务提供者)

异常要点是:database column responseGroups not found.

如果我没有在幕后为我的单个实体类指定该约束,Hibernate 会生成两个表:一个用于所有“简单”实体数据,另一个表用于 Set<ResponseGroup> responseGroups实体数据:

CREATE TABLE `jpaitemsearchrequest` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`browseNode` VARCHAR(255) NULL DEFAULT NULL,
`itemPage` INT(11) NOT NULL,
`keywords` VARCHAR(255) NULL DEFAULT NULL,
`locale` VARCHAR(255) NULL DEFAULT NULL,
`searchIndex` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3;

...

CREATE TABLE `jpaitemsearchrequest_responsegroups` (
`JpaItemSearchRequest_id` BIGINT(20) NOT NULL,
`responseGroups` VARCHAR(255) NULL DEFAULT NULL,
INDEX `FKC217757B99AE0422` (`JpaItemSearchRequest_id`),
CONSTRAINT `FKC217757B99AE0422` FOREIGN KEY (`JpaItemSearchRequest_id`) REFERENCES `jpaitemsearchrequest` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

如何正确表达我的约束?


编辑

本题用于阅读:
JPA:集合中的唯一约束(...另一个表上的唯一约束)

进一步思考我的问题,我相信它可以归结为以下问题:
JPA:如何表达包含@ElementCollection 列的唯一约束?

最佳答案

可以使用 @CollectionTable 定义集合表中列的唯一约束与元素集合。

@CollectionTable(
uniqueConstraints= @UniqueConstraint(columnNames={"col1","col2"})
)

如前所述,这些是映射元素集合的表的列。无法对多个表中的列进行唯一约束。

关于java - JPA:如何表达包含@ElementCollection 列的唯一约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14673118/

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