Как указать, что только несколько полей объекта должны быть вставлены с помощью ReactiveCassandraRepository

С Spring Data, как мне указать ReactiveCassandraRepository, что в Cassandra DB нужно вставить только несколько полей переданного объекта?

Например,

Если моя Сущность выглядит следующим образом,

@Table("employee_tb")
public class Employee {

    @PrimaryKey("emp_id")
    private int empId;

    @Column("emp_name")
    private String empName;

    @Column("emp_dept")
    private int empDept;

    @Column("emp_salary")
    private int empSalary;
    ........
    ........
    <Setters & Getters>
    ........
    ........
}

и мой репозиторий

public interface myCassandraRepo extends ReactiveCassandraRepository<Employee, int>{

}

и если я хочу вставить новую запись в БД с emp_id, emp_name и emp_dept (исключая emp_salary), что мне делать..!!?

Я старался

Employee emp = new Employee();
emp.setEmpId(1234);
emp.setEmpName("Test");
emp.setEmpDept(5);

myCassandraRepo.insert(emp);

А также с помощью save()

myCassandraRepo.save(emp);

В обоих случаях в БД создается новая запись, но поле emp_salary также вставляется с инициализированным значением 0, чего я хочу избежать.

Как я могу добиться этого, пожалуйста, помогите


person Krishna    schedule 28.04.2020    source источник


Ответы (1)


Spring Data обычно следует правилу, согласно которому все ненулевые поля записываются в базовую базу данных. В вашем случае emp_salary является примитивным значением, поэтому оно не равно нулю.

У вас есть следующие параметры для изменения поведения сохраняемости отдельных свойств:

  • @ReadOnlyProperty: Используйте, чтобы пометить свойство как доступное только для чтения. Значение свойства считывается из базы данных, но не записывается.
  • @Transient: полностью исключить свойство из чтения или записи.

Cassandra имеет некоторые особенности, которые необходимо учитывать в контексте персистентности. Поскольку у Cassandra нет средств для генерации ключа, мы не можем знать, существует ли уже строка для сохраняемого объекта. Поэтому Spring Data Casandra использует механизм upsert, всегда выдавая оператор INSERT, который содержит null значений. Это делается для того, чтобы убедиться, что если строка уже существует, пустые поля будут перезаписаны, чтобы состояние объекта отражалось в базе данных.

Вы можете применить оптимизацию в своем коде. Если вы знаете, что ваша сущность новая, вы можете вызвать ReactiveCassandraRepository.insert(…), который опускает пустые поля.

См. также справочную документацию для дальнейшего использования.

person mp911de    schedule 29.04.2020