我有两个实体由Hibernate管理。我们称他们为User
和UserRecord
。 User
包含一组UserRecord
,每个UserRecord
包含一个Integer
。
这些方面的东西:
@Entity(name = "User")
public class User implements Serializable
{
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "userKey")
@Index(name = "ByUserKey", columnNames = "userKey")
private Set<UserRecord> userRecordSet;
...
}
-
@Entity(name = "UserRecord")
public class UserRecord implements Comparable<UserRecord>, Serializable
{
@Id @GeneratedValue @Column(name = "userRecordKey")
private long id;
@Column(nullable = false)
private Integer recordNumber;
@ManyToOne @JoinColumn(name = "userKey") @Index(name = "ByUserKey", columnNames = "userKey")
private User user;
...
}
一个页面上的Spring表单为我们的用户提供了一组字段,用于更改与其帐户关联的记录编号。在此页面上添加或更改数字工作正常。删除似乎是一个问题。
我们有一个函数试图在用户保存回数据库之前从列表中删除任何空白记录。
private void removeBlankUserRecords(User user)
{
Set<userRecord> userRecordSet = user.getUserRecordSet();
if (userRecordSet != null && !userRecordSet.isEmpty())
{
Iterator<UserRecord> iterator = userRecordSet.iterator();
while (iterator.hasNext())
{
UserRecord record = iterator.next();
if (record.getRecordNumber() == null || record.getRecordNumber().equals(Integer.valueOf(0)))
{
if (record.getId() > 0) //If object already exists in the DB
{
//Set the record number to a sentinel value to avoid null error
record.setRecordNumber(Integer.valueOf(-1));
}
iterator.remove();
}
}
}
}
出于某种原因,当我在事务完成后查看数据库时,我仍然在数据库中使用sentinel值删除了UserRecord
。更奇怪的是,如果我再次执行该过程,在Spring表单中删除sentinel值,则删除工作。
似乎只要UserRecord
对象的数据被更改,就无法删除。有人可以向我解释为什么会这样吗?