【发布时间】:2015-09-25 19:11:39
【问题描述】:
在删除实体之前,必须从其父列表中删除实体,并从实体本身中删除父实体。
示例(EJB 中的 CMT)从州到市的一对多:
public boolean delete(City city) { // Detached instance.
City managedCity = entityManager.contains(city) ? city : entityManager.merge(city);
managedCity.getState().getCityList().remove(managedCity);
managedCity.setState(null);
entityManager.remove(managedCity);
return true;
}
语句managedCity.setState(null); 将实体的父级设置为null。由于它是一个托管实体,因此对该实体所做的任何更改都会影响到底层数据库。相应地,将生成一个UPDATE 语句,并将数据库表中的state_id 设置为null。
UPDATE db.city SET state_id = ?, row_version = ? WHERE ((city_id = ?) AND (row_version = ?))
bind => [null, 2, 10, 1]
这是非常不受欢迎的。除了发出附加的UPDATE 语句外,它还尝试将数据库表中的state_id 设置为null,如果对数据库表中的相应列强制执行NOT NULL 数据库约束,则会导致问题。
如何在删除实体本身之前正确删除实体的父级,或者甚至不需要在删除实体之前删除(将其设置为null)父级(在某些情况下会导致问题。因此答案应该是, 没有)?
【问题讨论】:
标签: hibernate jpa eclipselink jpa-2.1