Какие варианты у меня есть для сохранения прошлых значений Java-объекта? Журнал аудита или Список <Object>? - PullRequest
2 голосов
/ 03 декабря 2009

Возьмите мой класс домена, например

public class Person
{
  private Integer id;
  private String name;
  private String address;
  private String telephone;

  //Accessors here..
}

Это отлично подходит для хранения 1 экземпляра данного Person, однако, например, name, скорее всего, со временем изменится, и я хотел бы сохранить любые предыдущие значения, возможно, я хотел бы посмотреть, какие адреса это человек жил в течение последних 10 лет.

Какие у меня есть варианты для этого? Это веб-приложение на Java, поэтому в моей схеме потенциально может быть таблица AUDIT_LOG, но это не очень надежный способ отслеживания этих изменений

Другая мысль состоит в том, чтобы иметь PersonFamily и хранить все экземпляры person, предполагая, что последний элемент в Списке является самым последним, например ..

 public class PersonFamily
 {
   private Integer id;
   private List<Person> persons;

   //Accessors here...
 }

Есть предложения, как мне этого добиться? Есть ли действительно чистый и простой процесс, который я пропустил?

Спасибо

Ответы [ 5 ]

1 голос
/ 03 декабря 2009

Вариант, который вы могли бы рассмотреть, это простой номер версии, привязанный к классу:

public class Person 
{
  private Integer id;
  private Integer version;

  private String name;
  private String address;
  private String telephone;

  //additional class stuff...

}

Используя этот подход, всякий раз, когда имя, адрес или другие атрибуты обновляются, номер версии увеличивается на единицу. Это сохраняет исходные данные в предыдущей версии и позволяет легко извлекать все предыдущие версии по идентификатору, который не изменяется.

1 голос
/ 03 декабря 2009
public class Person
{
  private Integer id;
  private String name;
  private Address address;

 }


public class Address {
  Integer id;
  String line1;
  String line2.
}

Затем смоделируйте это в своей базе данных как:

Персона Таблица

  • ID
  • имя

Адрес Таблица

  • ID
  • line1
  • line2

PersonAddressHistory Таблица с полями:

  • id
  • PersonId
  • AddressID
  • activeDate

последняя таблица содержит список текущих и предыдущих адресов, связанных с человеком, причем текущий адрес является последней записью (то есть с максимальным значением id).

0 голосов
/ 03 декабря 2009

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

Например, с вашим личным примером, у меня будет поле «Текущее / прошлое» в базе данных. В большинстве случаев я просто получаю запись «Текущий», и она будет действовать так же, как и сейчас - без изменений в DAO или объектной модели (за исключением, возможно, добавления меток времени начала / конца).

Когда вам требуется история, это, вероятно, по очень конкретным причинам, и вы можете в это время получить отдельный Список, упорядоченный по дате изменения. Это будет отдельно от обычно используемой модели данных.

Когда кто-то меняет свое имя, клонируйте Персона, измените новую запись на «Предыдущая», затем измените имя существующей записи, затем подтвердите оба изменения в одной транзакции.

Обратите внимание, что если исторические данные используются очень часто, то вышеприведенное не имеет значения, и у вас должен быть список с текущей записью. Это может быть в случае с историей адресов, которая очень часто используется в финансовых приложениях. В дополнение к смене имени, наиболее распространенным изменением является вступление в брак / развод, поэтому в вашей модели данных должно быть дополнительное поле - девичья фамилия.

0 голосов
/ 03 декабря 2009

Есть много способов сделать это. Самым простым было бы иметь "Person", у которого есть список объектов "PersonHistory". Каждый раз, когда вы вызываете сеттер, создайте новый объект PersonHistory с теми же значениями, что и у самого последнего. Затем измените измененное поле и сохраните его в своем списке.

Проблема в том, что у вас будет много избыточных данных, по одному на каждое изменение. Если это будет поддержано базой данных A, хотя вместо того, чтобы хранить огромный список, вы можете сбросить каждый старый экземпляр в БД при каждом изменении (поэтому вы сохраняете в памяти только самый последний экземпляр)

В противном случае вы могли бы иметь один список для каждой переменной и хранить кортеж со значением и «шагом». Таким образом, каждый раз, когда переменная изменяется, вы обновляете счетчик и сохраняете этот счетчик со значением, которое изменилось.

0 голосов
/ 03 декабря 2009

Google для временных шаблонов или источников событий.

http://martinfowler.com/eaaDev/timeNarrative.html

...