gpt4 book ai didi

java - 如何在 Hibernate 中存储添加到数据库的每个实体的副本

转载 作者:行者123 更新时间:2023-12-01 15:38:42 26 4
gpt4 key购买 nike

我有一个存储在 Hibernate 中的实体(代表音乐文件)。用户可以修改实体的属性,并且在某些时候他们所做的更改可以保存回原始文件。但在将更改保存到文件之前的任何时间点,我希望能够看到我最初加载的实体与此后所做的任何更改之间的差异,我希望这些差异存储在数据库中,而不是存储在表示实体的类中因为我使用 Hibernate 的主要原因是最大限度地减少内存使用。否则,我的内存使用率可能会很高,因为应用程序中可能有数千个实体。

所以看来最简单的解决方案是将实体存储两次,其中一个是只读副本,我只是指比较差异,但是正确的方法是什么?

编辑:所以我建议了下面一个适合我的解决方案,因为当我保存更改时,我可以看到发生了什么变化,但我现在想通过两种方式更进一步。当我下次启动程序时加载文件时,我想检查该文件是否已在数据库中具有相同/稍后的修改日期,因此我使用数据库中的记录,而不必再次解析文件,所以我的想法是将编辑后的内容变成原来的内容。但我也想让用户回滚更改,在这种情况下我需要保持原始状态。

所以现在考虑下面给出的关于向 Song 实体添加日期和 boolean 字段 r 的答案可能更有意义,允许用户回滚到他们喜欢的任何版本,所以我仍然保留 SongParent,然后拥有 @oneToMany 关系到歌曲

或者我刚刚找到了 http://www.jboss.org/envers项目这可能就是我需要的

最佳答案

因此,我决定采用 Hibernate 并创建一个包含 Song 类的两个实例的父类(super class),这对我有用。

@Entity
public class SongParent
{
@Id
@GeneratedValue
private Integer recNo;

@OneToOne(cascade={CascadeType.ALL})
private Song originalSong;

@OneToOne(cascade={CascadeType.ALL})
private Song editedSong;

public Integer getRecNo()
{
return recNo;
}

public void setRecNo(Integer recNo)
{
this.recNo = recNo;
}

public Song getOriginalSong()
{
return originalSong;
}

public void setOriginalSong(Song originalSong)
{
this.originalSong = originalSong;
}

public Song getEditedSong()
{
return editedSong;
}

public void setEditedSong(Song editedSong)
{
this.editedSong = editedSong;
}
}

关于java - 如何在 Hibernate 中存储添加到数据库的每个实体的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8431299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com