我有一类包含图书对象列表的用户。创建用户的记录后,他借用的所有书籍都将添加到其对象中的书籍列表中。一旦用户删除了他的个人资料,就需要保留借阅书籍的记录和历史记录。
许多注册用户可能经常借书并删除他们的个人资料。为了更快地进行信息检索(例如,检索活动用户列表),我不想将删除的配置文件的记录保存在我保留活动配置文件记录的同一个表中。
目前,一旦用户想删除他的个人资料,我将该对象(userObj)放在deactiveUserObj中并从User表中删除用户的记录并尝试保存deactiveUserObj以保留该表中已停用记录的记录,但它会抛出以下异常
我的选择:我知道我可以创建另一个表并保留活动用户的id或者为用户类添加一个类型为boolean的额外列,并将其设置为false以指示该记录已被删除。但是我不确定这三种方法中的哪一种更好,或者是否有其他方法我没有考虑过。
用户类
@Entity
public class User{
private long id;
private List<Book> books;
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<Book> getBooks() {
return books;
}
....
预订课程
@Entity
public class Book{
private long id;
private string name;
...
}
已删除对象类
@Entity
public class DeactiveUsers{
private long id;
private date deactiveSince;
private List<Book> books;
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<Book> getBooks() {
return books;
}
....
}
mycode的
1) code to retrieve an object of user class goes here
2) code to copy object of user class into deletedObject goes here
3) 3.1 - session.delete(userObj);
3.2 - session.saveOrUpdate(deactiveUsersObj);
代码遇到以下错误
SEVERE: org.hibernate.ObjectDeletedException: deleted object would be re-saved by
cascade (remove deleted object from associations): [com.project.Book#1]
答案 0 :(得分:2)
首先:出现错误的原因是您在User.getBooks()上将级联设置为ALL,这将在您删除用户时删除其书籍。然后,在同一个会话中,当您添加DeactivatedUser(包含相同的书籍)时,您尝试重新添加已删除的对象 - 虽然您没有显示用于从用户构建DeactivatedUser的代码,但我认为您是正如你所愿,制作一本浅薄的书籍。将级联更改为SAVE_UPDATE。
第二:我强烈建议将它们全部保存在同一个表中,并带有一个标志字段,指示它们是否被删除。
不要过早优化。除非您实际对代码进行基准测试,并且发现与活动用户和非活动用户相关的数据库查询存在瓶颈,否则过度复杂的架构和业务逻辑没有任何好处。大多数SQL服务器都非常高效,您不太可能在应用程序中找到瓶颈。
这样做,提高性能的一种简单方法就是在已删除的标记字段上创建索引。
使用Hibernate,您可以通过条件轻松选择活动用户和已删除用户。
此外,最重要的是,通过没有单独的User和DeactiveUser对象,您不必并行维护这两个对象,也不必重复可以在两种类型上运行的代码。