Исключение Spring JPA при вставке значения Json (с использованием hibernate-types-52) - PullRequest
1 голос
/ 28 марта 2020

Я использую 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

Я пробовал много исправлений, предложенных для этой ошибки, но я не могу понять природу самой ошибки. Что не так с этим подходом? Помимо подсказки по исправлению, я хотел бы понять, почему возникла эта ошибка.

1 Ответ

1 голос
/ 28 марта 2020

Ошибка означает, что есть экземпляр объекта HKEntity, на который ссылается откуда-то в текущем сеансе Hibernate, и вы ни явно не сохранили этот экземпляр, ни инструктировали Hibernate для его каскадного сохранения. Трудно сказать, что именно происходит, но есть некоторые проблемы с вашим кодом, которые могли бы спутать либо среду Spring Data JPA, либо сам Hibernate.

Во-первых, интерфейс Spring * CrudRepository уже имеет save() метод, так что вы можете использовать его вместо test_json() метода.

Я также не вижу причин вставлять сущность Hibernate с собственным запросом, и я даже не думаю, что это правильный запрос. Ваш метод test_json() пытается встроить сущность HKEntity в таблицу hk_data, но сущность HKEntity должна быть сохранена в таблицу hoshin_kanri, в соответствии с вашим отображением.

Итак, я изменит ваш сервисный код следующим образом:

    public String json_test() {
        HKData d = new HKData("Prova", Year.now(), "Descrizione");
        HKEntity e = new HKEntity(1,d);
        hk_repository.save(e);
        return "Value created";
    }
...