【发布时间】:2016-07-30 14:33:45
【问题描述】:
我有一个带有@ElementCollection 注释的实体Customer:
@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() 时它会删除表。
【问题讨论】:
-
你的 for 循环中有什么?
-
@Henry - 我只将这一行放在循环中 -
System.out.println("Test");以确保它发生在循环中而不是循环内。仍然发生 -
@jonmartinsolaas - 感谢您的参考。我昨天访问了这个问题,但它似乎并不那么相关。就我而言,我不会在任何地方调用删除或插入。我也让我在别名表上有一个主键。
-
您不必为此调用 delete 或 insert。关键是——当 Hibernate 对元素的身份感到困惑时,它会删除 ALL,然后从持有集合的实体中插入 ALL,当一个元素是脏的,或者可能是脏的,因为它不知道哪个单行在要更新的表。为了进一步混淆,这是实现的,以便在删除之前插入发生,除非您将巧妙的刷新语句放在合适的位置。如果没有,并且您在表上有一个唯一索引,您将违反约束。这可能是您的问题,也可能不是:o)