Постоянство jpa 2.0: создание и обновление дилеммы - PullRequest
0 голосов
/ 19 января 2012

Я использую JPA 2.0 с hibernate в качестве jpa-провайдера. Направление для моего проекта - сохранить JPA DAO - реализация нейтральной. Таким образом, я не могу использовать объект сеанса гибернации или что-либо, что является специфическим для гибернации. У нас достаточно большое количество поисков, и эти значения поиска должны быть периодическими, поскольку я имею в виду, что они в основном остаются постоянными для примера периода, скажем, у нас есть таблица поиска валюты

Currency code --> Drachma
Description --> Greece
From date --> 01-Jan-1960
To date --> 01-Nov-2005 (this is just an example)

Currency code --> Euro
Description --> Greece
From date --> 02-Nov-2005
To date --> null (null indicates until today)

Я разработал базовый класс поиска, который выглядит так для всех поисков

@MappedSuperclass
public abstract class BaseLookupEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "code", nullable = false)
private String code;

@Column(name = "description", nullable = false)
private String description;

@Column(name = "from_date", nullable = false)
@Temporal(TemporalType.DATE)
private Date fromDate;

@Column(name = "to_date")
@Temporal(TemporalType.DATE)
private Date toDate;

// getters and setters

Дилемма

Учитывая, что сервисный уровень получает новые экземпляры от клиента без поля идентификатора, для каждого Создания или Обновления объекта, который содержит n номеров таких периодических кодов поиска, нужно ли явно запрашивать все эти таблицы поиска, чтобы увидеть если эти значения существуют, и если они существуют и требуют обновления, обновите столбец to_date, а затем создайте новую запись поиска.

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

Приветствие.

1 Ответ

1 голос
/ 19 января 2012

Нет встроенного механизма, чтобы делать то, что вы хотите, но это не очень сложно.

  1. Выполните запрос JPQL, чтобы получить все значения, код которых находится в наборе кодов, которые вы получаете, и чье поле toDate имеет значение null: select c from Currency c where c.code in (:codes) and c.toDate is null (убедитесь, что число кодов не превышает ограничение базы данных для IN, однако. Если это так, выполнить несколько запросов)
  2. Создайте Map<String, Currency> из списка найденных валют (ключом карты является код валюты)
  3. Перебор валют для обновления. Для каждой валюты найдите ее постоянную версию на карте. Если на карте, обновите ее поле toDate
  4. Создайте новый экземпляр валюты и сохраните его.

Этот процесс можно легко сделать универсальным для всех реализаций вашего базового класса.

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