JPA中@ElementCollection的@AttributeOverrides未生效问题咨询
解决@ElementCollection中@AttributeOverrides未生效的问题
你遇到的这个情况不是预期结果,是可以通过调整配置来解决的。我来帮你分析一下原因和解决方案:
问题背景回顾
你定义了一个可嵌入的Address类:
@Embeddable public class Address { @Column(name="str") private String street; @Column(name="nr") private int number; // getters/setters }
然后在User实体中分别将它用作单个属性mainAddress(这里的@AttributeOverrides生效正常)和集合属性otherAddresses,但集合属性上的列名覆盖配置被忽略,生成的user_addresses表还是用了Address类默认的列名str和nr,而非你指定的other_user_address_street和other_user_address_number。
原因分析
在EclipseLink 2.7.1结合Java 8的环境中,虽然Java 8支持泛型类型推断,但JPA实现可能无法准确识别List<Address>的元素类型(泛型擦除的遗留影响),导致@AttributeOverrides的配置没有被关联到嵌入类的属性上。
解决方案
只需要在@ElementCollection注解中显式指定targetClass属性,明确集合元素的类型即可:
@Entity public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id; // mainAddress的配置保持不变 @AttributeOverrides({ @AttributeOverride( name="street", column=@Column(name="main_user_address_street") ), @AttributeOverride( name="number", column=@Column(name="main_user_address_number") ) }) private Address mainAddress; // 修改后的otherAddresses配置 @ElementCollection(targetClass = Address.class) // 新增targetClass指定 @CollectionTable( name="user_addresses", joinColumns=@JoinColumn(name="user_id") ) @AttributeOverrides({ @AttributeOverride( name="street", column=@Column(name="other_user_address_street") ), @AttributeOverride( name="number", column=@Column(name="other_user_address_number") ) }) private List<Address> otherAddresses; // getters/setters }
另外还要注意两个细节:
- 确保数据库生成策略是
create或create-drop(比如在persistence.xml中设置<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>),避免旧的表结构被复用。 - 检查
persistence.xml中是否启用了正确的JPA 2.2版本配置,避免版本不兼容导致的解析问题。
验证结果
修改后重新启动应用,生成的user_addresses表结构应该会符合你的预期:
user_addresses(other_user_address_number, other_user_address_street, user_id)
内容的提问来源于stack exchange,提问作者energize-cactus
相关产品推荐
相关产品推荐

