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

时间:2011-12-08 12:54:30

标签: java hibernate copy persistence

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

所以似乎最简单的解决方案是将实体存储两次,其中一个是只读副本,我只是参考比较差异,但是这样做的正确方法是什么?

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

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

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

3 个答案:

答案 0 :(得分:1)

所以我决定接受Hibernate并创建一个包含Song类的两个实例的超类,这对我有用。

@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;
    }
}

答案 1 :(得分:0)

您可以在ArrayList(模式Command)中跟踪所有更改(我假设它们是通过 setters 执行的)。我不确定我是否理解你的问题。

答案 2 :(得分:0)

我只是编写这样的东西,我可以建议你使用历史表结构,其中每个表都有valid_from valid_to(时间戳)和current(布尔)列一个音乐文件是当前音乐文件,您可以使用日期字段查看所有更改!

我还在我的应用程序中使用了命令模式,如上所述,将更改应用于数据库。