Как сохранить копию каждой сущности, которую я добавляю в базу данных в Hibernate? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть объект (представляющий музыкальный файл), который я храню в Hibernate. Пользователь может изменить атрибуты объекта, и в какой-то момент внесенные изменения могут быть сохранены обратно в исходный файл. Но в любой момент времени, прежде чем они сохранят изменения в файле, я хотел бы видеть различия между сущностью, которую я первоначально загрузил, и любыми изменениями, внесенными с тех пор, я хочу, чтобы эти различия были сохранены в базе данных, а не в классе, представляющем сущность потому что главная причина, по которой я использую Hibernate, - минимизировать использование памяти. В противном случае мое использование памяти может быть высоким, так как в приложении могут быть тысячи объектов.

Так что, кажется, самое простое решение - сохранить сущность дважды, причем одна из них - это копия только для чтения, на которую я просто ссылаюсь для сравнения различий, но как правильно это сделать?

РЕДАКТИРОВАТЬ: Итак, я предложил ниже решение, которое работает для меня в том, что, когда я прихожу к сохранению изменений, я вижу, что изменилось, но теперь я хочу сделать еще один шаг в двух направлениях. Когда я загружаю файл в следующий раз, когда я запускаю программу, я хочу проверить, находится ли файл в базе данных с такой же / более поздней датой изменения, поэтому я использую запись в базе данных, а не анализирую файл снова, поэтому моя идея была положить содержание отредактировано в оригинал. Но также я хотел бы дать пользователю возможность откатить изменения, в этом случае мне нужно сохранить оригинал.

Так что теперь, думая, что приведенный ниже ответ о добавлении дат и логического поля сущности песни может иметь больше смысла, позволяя пользователю откатиться до любой версии, которая ему нравится, поэтому я все равно оставлю SongParent и затем буду иметь отношение @oneToMany на песню

В качестве альтернативы, я только что нашел проект http://www.jboss.org/envers, это может быть то, что мне нужно

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Поэтому я решил использовать 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;
    }
}
0 голосов
/ 08 декабря 2011

Я просто программирую что-то вроде этого, я могу посоветовать вам использовать структуру таблицы истории, где каждая таблица имеет столбцы valid_from valid_to (метки времени) и current (логическое значение), только один музыкальный файл является текущимодин, и вы можете увидеть все изменения, сделанные с помощью полей даты!

Я также использовал шаблон команды в своем приложении, как уже упоминалось, чтобы применить изменения к базе данных.

0 голосов
/ 08 декабря 2011

Вы можете отслеживать все изменения (я полагаю, что они выполняются через сеттеры ) в ArrayList (шаблон Команда ). Не уверен, что правильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...