当前位置: 首页 > 知识库问答 >
问题:

嵌入中的JPA ElementCollection未持久化

隗俊誉
2023-03-14

我遇到了一个问题,在我的JPA@ElementCollection表中没有任何内容被持久化。据我所知,我想我理解了@ElementCollection的基本思想。我猜出现问题的原因是,我在一个可嵌入的对象中有一个ElementCollection

一个简单的例子:

@Entity
public class CalculationHistory {

    private CalculationReason calculationReason;

    @Embedded
    public CalculationReason getCalculationReason() { return calculationReason; }

    protected void setCalculationReason(CalculationReason calculationReason {
        this.calculationReason = calculationReason;
    }
    ...
}

@Embeddable
public class CalculationReason {

    private List<String> descriptions;

    @ElementCollection
    @CollectionTable(name = "calculation_description", joinColumns = @JoinColumn("calculation_history_id"))
    @Column(name = "description")
    public List<String> getDescriptions() { return descriptions; }

    public void setDescriptions(List<String> descriptions) {
        this.descriptions = descriptions;
    }
    ...
}

有什么线索表明可能出了什么问题吗?

为了简洁起见,我将尽量使附加信息尽可能简短。

创建计算原因

public static CalculationReason create(List<String> descriptions) {
    return new CalculationReason(descriptions);
}

创建计算历史记录

public static CalculationHistory create(CalculationReason calculationReason) {
    CalculationHistory history = new CalculationHistory();
    history.setCalculationReason(calculationReason);
    ...
    return history;
} 

调试信息在计算历史#创建

HibernateDAO仓库

@Override
public <S extends E> S save(S entity) {
    return getHibernateTemplate().merge(getEntityClass().getName(), entity);
}

Hibernate生成的SQL

Hibernate: insert into calculation_history (created_date, modified_date, modified_by, reason, system) values (?, ?, ?, ?, ?)

看起来HiberNate甚至没有生成插入到calculation_description的...我期待的SQL(忽略额外的字段)


共有1个答案

萧修永
2023-03-14

经过数小时的反复试验,我通过初始化说明字段解决了问题:

 private List<String> descriptions = Lists.newArrayList();

老实说,我不太确定为什么这真的有所不同,所以欢迎任何外部意见。

 类似资料:
  • 我正在尝试将嵌入式数据库derby与spring框架结合使用。我可以插入数据并读取它。除了数据库没有持久化之外,一切都很好。当我关闭应用程序并再次运行时,数据不存在。我猜数据库是再次创建的,但不知道为什么。 我的代码: 和Spring的输出日志是 create-db.sql内容是 解决方案:接受的答案指向正确的方向,但误差为db;create=true无法启动。然后,我查看了Netbeans ID

  • 我有一个简单的JPA存储库,看起来如下所示: 和两个有一个单子映射的类,如下所示: . 现在,我知道我可以很容易地编辑和持久化一个像这样的用户实例: 但是,在没有指向实例的指针的上下文中,如何持久化实例,f.I.: 我可以只调用吗? 我是否需要自动连接另一个存储库()并在其上调用.save()?

  • 问题内容: 我一直在研究与SQL数据库接口的Persistent库。假设我有一个包含配方,配方,成分和RecIng表的数据库。 我对持久性的理解(绝对有限)使我相信我应该定义如下表: 这样,可以使用Esqueleto获取这些表之间的内部联接: 这将返回(Recipe,RecIng,Ingredient)的元组。 我真正想要的是一种查询配方的方法,其结果如下: 除了定义一组额外的数据类型并转换元组之

  • 本文向大家介绍Redis持久化深入详解,包括了Redis持久化深入详解的使用技巧和注意事项,需要的朋友参考一下 1、概述 Redis 是内存数据库,如果不能将内存中的数据保存到磁盘中,那么一旦服务器进程退出,服务器的数据库数据也会消失,所以Redis提供了持久化的功能,redis分为两种持久化方式:RDB和AOF。有以下几个特点: 1.RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

  • 问题内容: 我正在尝试编写一个Java程序,该程序将自动下载并命名一些我最喜欢的网络漫画。由于我将请求来自同一域的多个对象,因此我希望有一个持久的http连接,在下载所有漫画之前,我可以一直保持打开状态。以下是我正在进行的工作。如何在不打开新的http连接的情况下从相同域但路径不同发出另一个请求? 问题答案: 根据此处的文档,HTTP持久性在Java中是透明处理的,尽管它提供了一些选项,也可以通过

  • 我有一个名为的类,它有一个狗的列表: 狗类有一个小狗列表: 当我试图创建一个新的人类,它有一只狗,狗又有一只小狗,并且我使用带有spring的Hibernate JPA存储库来保存人类时: 我得到以下错误: 但是,如果我用默认值创建人类,并用人类存储库保存他,它就能工作,并且保存了小狗。 我不明白为什么小狗没有自动保存,我也不想使用一个单独的存储库来保存小狗。当狗定义时,Hibernate不应该自