Как указать только несколько полей сущности должны быть вставлены с ReactiveCassandraRepository - PullRequest
0 голосов
/ 28 апреля 2020

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

Например,

Если мой объект выглядит следующим образом ,

@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 , которого я хочу избежать.

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

1 Ответ

0 голосов
/ 29 апреля 2020

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

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

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

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

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

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

...