首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入Json值时的Spring异常(使用hibernate-types 52)

插入Json值时的Spring异常(使用hibernate-types 52)
EN

Stack Overflow用户
提问于 2020-03-28 10:47:40
回答 1查看 479关注 0票数 1

我使用Vlad的hibernate-types-52Spring 将POJO作为Json值插入到我的Postgresql数据库中。

我的实体是这样定义的:

代码语言:javascript
复制
@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

代码语言:javascript
复制
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;
    }

我定义了一个Repository接口来将对象查询到数据库中:

代码语言:javascript
复制
public interface HKRepository extends CrudRepository<HKEntity, Integer> {

    @Query(value = "INSERT INTO 'hk_data' VALUES :Entity", nativeQuery = true)
    void test_json(@Param("Entity") HKEntity e);
}

还有一个测试服务,看看它是否正常工作:

代码语言:javascript
复制
@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";
    }
}

但是,我仍然得到以下例外情况:

代码语言:javascript
复制
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.ehk.rest.entity.HKEntity

我尝试过许多针对此错误的修复,但我无法理解错误本身的本质。这种方法有什么问题?除了修复此错误的提示之外,我还想了解为什么会产生此错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 10:58:11

这个错误意味着有一个HKEntity实体的实例,它是从当前Hibernate会话的某个地方引用的,您既没有显式地持久化这个实例,也没有指示Hibernate级联地保存它。很难说到底是怎么回事,但是代码中有些问题可能混淆了Spring框架或Hibernate本身。

首先,Spring的CrudRepository接口已经有了一个save()方法,所以您可以使用它而不是test_json()方法。

我也没有理由插入带有本机查询的Hibernate实体,而且我甚至不认为这是一个有效的查询。test_json()方法本机尝试将HKEntity实体插入到hk_data表中,但是根据映射,HKEntity实体应该保存到hoshin_kanri表中。

因此,我将按以下方式更改您的服务代码:

代码语言:javascript
复制
    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";
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60900128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档