Обновить поле в сущности с updatable = false возвращает сущность с полем с новым значением

Я использую spring-data-jpa, и у меня есть объект со следующим кодом:

@Id
@GeneratedValue
@Column(columnDefinition = "uuid")
private UUID id;

@Basic(optional = false)
@Column(updatable = false)
private long creationTimestamp;
... 

Я использую org.springframework.data.jpa.repository.JpaRepository для выполнения соответствующих операций CRUD.

Когда я сначала сохраняю сущность (например, creationTimestamp = 1), метод save (entity) возвращает сохраненную сущность (как говорит javadoc) с новым идентификатором для дальнейших операций (как говорит javadoc) и с полем creationTimestamp = 1 .

Но позже, если я попытаюсь обновить эту сущность с помощью нового creationTimestamp (например, creationTimestamp = 2), снова с помощью метода save (entity) , этот метод возвращает сущность с полем creationTimestamp = 2 (что неверно).

Если я выполняю поиск с помощью метода findById (Given_id) , возвращаемая сущность имеет поле creationTimestamp = 1 , что является правильным, поскольку столбец был определен как updatable = false .

Вопрос в том, почему при обновлении метод save (entity) возвращает новое значение в creationTimestamp вместо того, которое находится в базе данных? Потому что я ожидаю «спасенную сущность» (как говорит Javadoc).

Всего 2 ответа


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


Как @Stefan сказал @Column(updatable = false) влияет только на слой базы данных

Здесь, в Stackoverflow, есть вопрос об этом

Если я понял, что вы пытаетесь сделать, я рекомендую Spring управлять этой колонкой с

        @Id
        @GeneratedValue
        @Column(columnDefinition = "uuid")
        private UUID id;

        @Basic(optional = false)
        @CreationTimestamp
        private java.sql.Timestamp creationTimestamp;

Используя эту реализацию, вам не нужно кодировать, чтобы установить значение в этом атрибуте. Вы только создаете метод получения.


Есть идеи?

10000