#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;
}
}