gpt4 book ai didi

java - 如何构建可嵌入类型的 ElementCollection?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:10 26 4
gpt4 key购买 nike

我使用 Hibernate 3.5.6 作为我的 JPA 2.0 实现。我正在尝试在我的实体中构建一个 @ElementCollection(省略了许多字段):

@Entity
public class Buyer implements Serializable {
...
@ElementCollection
private List<ContactDetails> contacts;
...
}

当集合包含基本类型时,我很容易完成这项工作,但我的 ContactDetails 是一个 @Embeddable 类:

@Embeddable
public class ContactDetails implements Serializable {
...
@Column(nullable = false)
private String streetOne;
....
}

当我运行让 Hibernate 生成 DDL 时,我得到如下错误:

INFO  - Environment                - Hibernate 3.5.6-Final
....
INFO - Version - Hibernate EntityManager 3.5.6-Final
....
INFO - SettingsFactory - RDBMS: PostgreSQL, version: 8.4.2
INFO - SettingsFactory - JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 9.0 JDBC4 (build 801)
INFO - Dialect - Using dialect: org.hibernate.dialect.PostgreSQLDialect
....
ERROR - SchemaUpdate - Unsuccessful: create table Buyer_contacts (Buyer_id int8 not null, contacts_collection&&element_county varchar(255), contacts_collection&&element_email varchar(255), contacts_collection&&element_fax varchar(255), contacts_collection&&element_mainphone varchar(255) not null, contacts_collection&&element_mobile varchar(255), contacts_collection&&element_name varchar(255) not null, contacts_collection&&element_postcode varchar(255) not null, contacts_collection&&element_streetone varchar(255) not null, contacts_collection&&element_streettwo varchar(255), contacts_collection&&element_town varchar(255) not null)
ERROR - SchemaUpdate - ERROR: syntax error at or near "&&" Position: 73

有没有办法说服 Hibernate 在表中为集合类生成有效的列名?理想情况下,一种不违反不要重复自己原则的方法是指定每个单独的列名称。

最佳答案

这是由于 DefaultComponentSafeNamingStrategy@ElementCollection 实现细节不兼容导致的 Hibernate 错误。

.collection&&element. 是一个内部占位符,在将属性名称用作列名之前应将其删除。其他命名策略通过仅使用最后一个 . 之后的属性名称部分有效地删除它,而 DefaultComponentSafeNamingStrategy. 替换为 _ s 但不删除占位符。

如果您确实需要 DefaultComponentSafeNamingStrategy,这里有一个解决方法:

public class FixedDefaultComponentSafeNamingStrategy extends DefaultComponentSafeNamingStrategy {
@Override
public String propertyToColumnName(String propertyName) {
return super.propertyToColumnName(
propertyName.replace(".collection&&element.", "."));
}
}

报告:HHH-6005 .

关于java - 如何构建可嵌入类型的 ElementCollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5274309/

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