Hibernate从数据库中删除数据而不请求删除

时间:2016-04-09 08:47:59

标签: java spring hibernate

我有一个带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()时,它会删除表格。

1 个答案:

答案 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。