我有一个带Customer
注释的实体@ElementCollection
:
@Entity
@Table(name = "customer")
public class Customer {
@Id
@Column(name = "id")
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@ElementCollection
@CollectionTable(name = "customer_alias", joinColumns = @JoinColumn(name = "customer_id") )
@Column(name = "alias")
private List<String> aliases;
}
当我启动应用时,表customer_alias
包含几行。在我的代码中,我有一个迭代别名的循环:
for(String alias: customer.getAliases()) { ... }
奇怪的是,在这一行之后我在日志中看到这两行:
Hibernate: select aliases0_.customer_id as cus1_3_0_, aliases0_.aliase as ali2_0_0_ from customer_alias aliases0_ where aliases0_.customer_id=?
Hibernate: delete from customer_alias where customer_id=?
当然 - 在'删除'行之后,数据将从数据库中删除,我无法弄清楚原因。在我的代码中我没有在哪里调用delete,它就在for循环之后发生。看起来当我调用getAliases()
时,它会删除表格。
答案 0 :(得分:0)
来自https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection
JPA 2.0规范没有提供定义Id的方法 可嵌入的。但是,删除或更新元素 ElementCollection映射通常需要一些唯一键。 否则,在每次更新时,JPA提供程序都需要删除 来自实体的CollectionTable的所有内容,然后插入 价值回来了。因此,JPA提供商很可能会认为 Embeddable中所有字段的组合都是独一无二的 与外键组合(JoinColumn(s))。然而,这可以 如果Embeddable很大,那么效率低下,或者说不可行 复杂。
某些JPA提供程序可能允许在中指定Id 可嵌入,解决此问题。请注意,在这种情况下,Id只需要 对于集合而言是唯一的,而不是表,就像外键一样 包括在内。有些人还可能允许CollectionTable上的唯一选项 用于此。否则,如果您的Embeddable很复杂,您可以 考虑将其变为实体并改为使用OneToMany。