объединение сущности с одноэлементным отображением и полем @version вызывает удаление предыдущего отображения - PullRequest
0 голосов
/ 13 января 2012

Привет! Все,

У меня проблема с двумя объектами. отображается через @OneToMany однонаправленное отношение. У меня есть сущность Artifact, которая может иметь несколько Revision. Вот как я их нанёс на карту

@Entity
@Table(name = "artifact")
public class Artifact implements Serializable {

  private static final long serialVersionUID = 248298400283358441L;

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

  @Version
  private Integer version;

  ...   

  @OneToMany(cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE })
  @JoinTable(name = "artifact_revisions", joinColumns = @JoinColumn(name = "artifact_id"), inverseJoinColumns = @JoinColumn(name = "revision_id"))
  private Set<Revision> revisions;

И редакция сущности

@Entity
@Table(name = "revision")
public class Revision implements Serializable {

  private static final long serialVersionUID = -1823230375873326645L;

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

  ...

  @Column(name = "date_created", nullable = false)
  @Temporal(TemporalType.TIMESTAMP)
  private Date creationDate;

Таблица ревизий сохраняет имя файла, которое было обновлено; старое значение и новое значение и т. д.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я обновляю артефакт; последнее сопоставление удаляется, а затем вставляется новое, так что если в результате у меня будет доступна только последняя, ​​но одна ревизия, а не вся история ревизий.

Hibernate: 
    update
        artifact 
    set
        description=?,
        estimate=?,
        name=?,
        rank=?,
        status=?,
        sysId=?,
        version=? 
    where
        id=? 
        and version=?
Hibernate: 
    delete 
    from
        artifact_revisions 
    where
        artifact_id=? 
        and revision_id=?
Hibernate: 
    insert 
    into
        artifact_revisions
        (artifact_id, revision_id) 
    values
        (?, ?)

Если я удаляю аннотацию @version из артефакта, она работает нормально.

  1. Это потому, что я неправильно отображаю отношения? Должно ли это отношение отображаться как коллекция элементов?
  2. Существует еще одна сущность Task, которая должна быть сопоставлена ​​с сущностью Revision. Итак, что будет лучшим подходом здесь?

1 Ответ

0 голосов
/ 13 января 2012

Возможно, это не прямой ответ на ваш вопрос, но я думаю, что вам стоит заглянуть в спящий режим. Я думаю, что это делает довольно похожую вещь. (envers обозначает версионирование сущностей). Вы просто комментируете сущность с помощью @Audited, помещаете некоторых слушателей в конфигурацию, и все остальное для вас сделано.

...