Обновить поле в сущности с updatable = false возвращает сущность с полем с новым значением - PullRequest
0 голосов
/ 11 февраля 2020

Я использую 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) возвращает сохраненную сущность (как говорит javado c) с новым id для дальнейших операций (как говорит javado c) и с полем creationTimestamp = 1 .

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

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

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

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

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

0 голосов
/ 11 февраля 2020

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

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

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

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

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

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

...