我有两个由 Hibernate 管理的实体。让我们称它们为User
and UserRecord
。AUser
包含一组UserRecord
s,每个都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();
}
}
}
}
由于某种原因,当我在事务完成后查看数据库时,我仍然UserRecord
在数据库中删除了带有哨兵值的内容。更奇怪的是,如果我再次执行该过程,在 Spring 表单中删除哨兵值,删除就会起作用。
似乎只要UserRecord
对象有数据被更改,它就不能被删除。有人可以向我解释为什么会这样吗?