Если свойство, помеченное @Version, присутствует и имеет значение null, или в случае свойства версии примитива введите 0, объект считается новым. Если свойство версии присутствует, но имеет другое значение, объект не считается новым.
Насколько я понимаю, Spring будет использовать даже примитивное поле версии, чтобы проверить, является ли объект новым или нет.
Однако в моем тестировании, если я создаю объект с примитивным полем версии, вручную устанавливаю идентификатор и пытаюсь сохранить (JpaRepository.save()) , Spring по-прежнему вызывает em.merge() (а не просто сохраняться), что приводит к дополнительному запросу выбора.
Изменение типа на Integer решает проблему.
Пример объекта:< /p>
Код: Выделить всё
//...other imports
import javax.persistence.Version;
@Entity
@Table(name = "test")
public class Test implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id
private Long id;
@Version
@NotNull
@Column(name = "entity_version")
private int entityVersion;
}
Код: Выделить всё
@Override
public boolean isNew(T entity) {
if (versionAttribute.isEmpty() ||
versionAttribute.map(Attribute::getJavaType).map(Class::isPrimitive).orElse(false)) {
return super.isNew(entity);
}
BeanWrapper wrapper = new DirectFieldAccessFallbackBeanWrapper(entity);
return versionAttribute.map(it -> wrapper.getPropertyValue(it.getName()) == null).orElse(true);
}
Если я правильно понял, он проверяет, имеет ли поле версии примитивный тип, и если да, просто вызывает метод super.isNew(), который проверяет только идентификатор.
p>
Я что-то упустил?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -for-entit
Мобильная версия