Обратный @OneToMany не обновляется - PullRequest
2 голосов
/ 01 декабря 2011

Имея следующую сущность:

@Entity
class Transaction implements Serializable {

  @Id @GeneratedValue
  Long id

  @Column(nullable = false, updatable = false)
  Long trNumber

  @OneToMany(mappedBy = "transaction", cascade = CascadeType.ALL, orphanRemoval = true)
  Set<Entry> entries = new HashSet()

  @Column(updatable = false, nullable = false)
  @Temporal(TemporalType.TIMESTAMP)
  Date creationDate
}

Я бы хотел, чтобы записи невозможно было обновить, но @OneToMany не допускает атрибут updatable = false.

Вот объект Entry:

@Entity
class Entry implements Serializable {

  @Id @GeneratedValue
  Long id

  @ManyToOne(cascade= CascadeType.ALL)
  @JoinColumn(updatable = false, nullable = false)
  Transaction transaction

}

Я могу использовать прослушиватель JPA для выдачи исключения каждый раз, когда мы пытаемся обновить транзакцию, но я бы хотел установить поведение updatable = false на уровне сущности, как и для других атрибутов.

1 Ответ

2 голосов
/ 02 декабря 2011

Я думаю, что вы не можете достичь этого, используя аннотации в JPA 2.0.В книге "Pro JPA 2" от Apress я читал, что такие отношения только для чтения обсуждаются для будущих версий спецификации.

У меня была похожая проблема, которая описывала здесь .Я также попросил Группу экспертов для любого комментария здесь (на момент написания этого поста - ответа не было).

Каскадирование немного не меняется, как и выне нужно «объединять» объекты, чтобы изменить его состояние.Вы можете просто извлечь Entry, который перемещен в управляемое состояние (он также переводит Transaction в управляемое состояние), поэтому каждое обновление должно в конце отражаться в базе данных.

Кажется, что @JoinColumn(updatable=false) означает просто то, что вы не можете изменить сущность Transaction на что-то другое, а не то, что вы не можете изменить ее состояние.

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

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