Используя Java Spring и CrudRepository, можно ли вставить новую строку в таблицу, не заполняя каждый столбец значением?

#java #spring #postgresql #crud-repository

Вопрос:

Я работаю над проектом, в котором мне периодически нужно заполнять таблицу из четырех столбцов строками. База данных-это postgresql. Столбцы-строка 1, дата 1, строка 2, дата 2. Я уже протестировал проект на python с помощью SQLAlchemy, где я заполнил строку 1 и дату 1 при начальной вставке, а затем заполнил строку 2 и дату 2. Из-за логики проекта строка 2 и дата 2 недоступны при вставке и могут быть обновлены через несколько недель после первоначальной вставки. С помощью SQLAlchemy я мог бы просто сделать вставку, подобную этой:

 row = Row(
string1 = "SomeString",
date1 = datetime.now()
)
 

Я также мог бы сделать это:

 row = Row(
string1 = "SomeString",
date1 = datetime.now(),
string2 = None,
date2 = None
)
 

Теперь мне нужно создать проект в Java Spring (с которым у меня мало опыта), и метод CrudRepository.save() не позволит мне сделать это ни одним из способов, описанных выше. Он настаивает на том, чтобы установить какое-то значение для каждого столбца (соответствующее правильному типу данных, на данный момент я использую LocalDate для дат, но подойдет любой тип данных даты). Обходной путь, который у меня сейчас есть, — это установка string2 = «» и date2 = LocalDate.parse(«0001-01-01»), но это неполное решение. Я хотел бы отправить значение Null/None, чтобы postgres вставил его как .

Организация на данный момент:

 @Entity
@DynamicUpdate
@Table(name = "subsets", schema = "public")
class Subsets(
    @Id
    val id: String,
    val author_created: String,
    val date_created: LocalDate,
    val author_committed: String,
    val date_committed: LocalDate,
) {
   private constructor() : this("", "", LocalDate.now(), "", LocalDate.now())
} 

 

Пост логика:

 @PostMapping("/createsubset")
fun createSubset(
    @RequestParam id: String,
    @RequestParam author_created: String,
    ){
    subsetsRepository.save(
        Subsets(
            id = id,
            author_created = author_created,
            date_created = LocalDate.now(),
            author_committed = "",
            date_committed = LocalDate.parse("0001-01-01")
        )
    )

}
 

Комментарии:

1. Можете ли вы показать свой класс сущностей. если строка 2 и дата 2 не помечены символом @NotNull, то определенно возможно вставить объект с нулевыми значениями для этих полей.

2. Я отредактировал вопрос, чтобы включить класс сущности и использование метода .save (). Я также попытался наложить @Column(nullable = true) строку 2 и дату 2, но безрезультатно, он все еще хочет, чтобы я установил значения.

3. не знаю, что это за язык или какая версия java, но я никогда не видел этого синтаксиса. val, в java нет ключевых слов.

Ответ №1:

проблема связана с определенным вами классом модели. Создайте класс модели, подобный приведенному ниже, чтобы вы могли легко сохранять данные.

 import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.sql.Timestamp;

@Entity
@Table(name = "subsets")
public class Subset {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "author_created", nullable = false)
    private String authorCreated;

    @Column(name = "date_created", updatable = false)
    @CreationTimestamp
    private Timestamp dateCreated;

    @Column(name = "author_committed")
    private String authorCommitted;

    @Column(name = "date_committed")
    @UpdateTimestamp
    private Timestamp dateCommitted;

    public Subset() {
    }

    public Subset(int id, String authorCreated) {
        this.id = id;
        this.authorCreated = authorCreated;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAuthorCreated() {
        return authorCreated;
    }

    public void setAuthorCreated(String authorCreated) {
        this.authorCreated = authorCreated;
    }

    public Timestamp getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Timestamp dateCreated) {
        this.dateCreated = dateCreated;
    }

    public String getAuthorCommitted() {
        return authorCommitted;
    }

    public void setAuthorCommitted(String authorCommitted) {
        this.authorCommitted = authorCommitted;
    }

    public Timestamp getDateCommitted() {
        return dateCommitted;
    }

    public void setDateCommitted(Timestamp dateCommitted) {
        this.dateCommitted = dateCommitted;
    }
}