Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的代码引发org.hibernate.ObjectDeletedException异常_Java_Hibernate_Jakarta Ee_Hibernate Mapping - Fatal编程技术网

Java 我的代码引发org.hibernate.ObjectDeletedException异常

Java 我的代码引发org.hibernate.ObjectDeletedException异常,java,hibernate,jakarta-ee,hibernate-mapping,Java,Hibernate,Jakarta Ee,Hibernate Mapping,我有一类用户,其中包括一个books对象列表。一旦用户的记录被创建,他借来的所有书籍都将添加到他对象中的书籍列表中。一旦用户删除了他的个人资料,就需要保存借阅书籍的记录和历史记录 许多注册用户可能经常借书并删除他们的个人资料。为了加快信息检索速度,例如,检索活动用户列表,我不希望将已删除配置文件的记录保存在与保留活动配置文件记录相同的表中 当前,一旦用户想要删除其配置文件,我就将该对象userObj放入deactiveUserObj中,并从用户表中删除该用户的记录,并尝试保存deactiveUs

我有一类用户,其中包括一个books对象列表。一旦用户的记录被创建,他借来的所有书籍都将添加到他对象中的书籍列表中。一旦用户删除了他的个人资料,就需要保存借阅书籍的记录和历史记录

许多注册用户可能经常借书并删除他们的个人资料。为了加快信息检索速度,例如,检索活动用户列表,我不希望将已删除配置文件的记录保存在与保留活动配置文件记录相同的表中

当前,一旦用户想要删除其配置文件,我就将该对象userObj放入deactiveUserObj中,并从用户表中删除该用户的记录,并尝试保存deactiveUserObj以将停用记录的记录保留在该表中,但它引发以下异常

我的选项:我知道我可以创建另一个表并将活动用户的id保留在那里,或者为用户类增加一个布尔类型的列,并将其设为false以指示记录已被删除。然而,我不确定这三种方法中哪一种更好,或者是否有另一种方法我没有考虑过

用户类

删除的对象类

代码遇到以下错误

SEVERE: org.hibernate.ObjectDeletedException: deleted object would be re-saved by 
        cascade (remove deleted object from associations): [com.project.Book#1]

第一:错误的原因是您已将cascade设置为User.getBooks上的ALL,当您删除用户时,它将删除其书籍。然后,在同一个会话中,当您添加包含相同书籍的DeactivatedUser时,尝试重新添加删除的对象-虽然您没有显示从用户构造DeactivatedUser的代码,但我认为您正在制作书籍的浅拷贝,这是您应该做的。更改级联以保存更新

第二:我强烈建议将它们放在同一个表中,并使用一个标志字段指示它们是否被删除

不要过早地优化。除非您确实对代码进行了基准测试,并在与活动用户和非活动用户相关的数据库查询中发现了瓶颈,否则过度复杂化模式和业务逻辑并没有任何好处。大多数SQL Server都非常高效,您不太可能在那里找到应用程序的瓶颈

通过这种方式,提高性能的一个简单方法就是在deleted flag字段上创建一个索引

使用Hibernate,您将能够通过标准轻松选择活动用户和已删除用户


此外,最重要的是,通过没有单独的User和DeactiveUser对象,您不必并行维护这两个对象,也不必复制可以在这两种类型上操作的代码。

好,如果需要为单个用户提供多个配置文件,如何?您的数据库模式应该反映您正在处理的对象。如果每个用户需要多个配置文件,那么您需要一个单独的配置文件对象、一个单独的配置文件表和一对多用户对配置文件的关系—在用户中放置一对多配置文件集,在配置文件中放置多对一用户字段。Hibernate的HQL查询将允许您根据相关用户中的字段选择配置文件,例如session.createQueryfrom Profile p,其中p.user.active=true。默认情况下,它将为您生成带有交叉联接的查询。
@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;
   }
   ....    

}
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]