Я использую hibernate-types-52 Влада Михалча вместе с Spring JPA , чтобы вставить POJO как значение Json в мою базу данных Postgresql.
Моя сущность определяется следующим образом:
@Entity
@Table(name = "hoshin_kanri")
@TypeDef(
name = "jsonb",
typeClass = JsonBinaryType.class
)
public class HKEntity {
@Id
@Column(name = "id_ai", columnDefinition = "bigint")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id_ai;
@Column(name = "id_hk", columnDefinition = "bigint")
private Integer id_hk;
@Type(type = "jsonb")
@Column(name = "hk_data", columnDefinition = "jsonb")
private HKData hk_data;
public HKEntity(Integer id_hk, HKData hk_data) {
this.id_hk = id_hk;
this.hk_data = hk_data;
}
И это POJO:
public class HKData {
private String name;
private Year targetYear;
private String description;
public HKData(String name, Year targetYear, String description) {
this.name = name;
this.targetYear = targetYear;
this.description = description;
}
Я определил интерфейс репозитория для запроса объектов в база данных:
public interface HKRepository extends CrudRepository<HKEntity, Integer> {
@Query(value = "INSERT INTO 'hk_data' VALUES :Entity", nativeQuery = true)
void test_json(@Param("Entity") HKEntity e);
}
и тест Служба , просто чтобы посмотреть, работает ли он правильно:
@Service
public class HKService {
@Autowired
HKRepository hk_repository;
public String json_test() {
HKData d = new HKData("Prova", Year.now(), "Descrizione");
HKEntity e = new HKEntity(1,d);
hk_repository.test_json(e);
return "Value created";
}
}
Однако я получаю следующее исключение:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.ehk.rest.entity.HKEntity
Я пробовал много исправлений, предложенных для этой ошибки, но я не могу понять природу самой ошибки. Что не так с этим подходом? Помимо подсказки по исправлению, я хотел бы понять, почему возникла эта ошибка.