【问题标题】:Java Map<Entity1, Entity2> mapping to the database using JPAJava Map<Entity1, Entity2> 使用 JPA 映射到数据库
【发布时间】:2015-04-21 22:20:38
【问题描述】:

在我正在进行的一个项目中,使用 JPA 将 (Hash)Map 映射到数据库似乎存在问题。

地图(名为“racers”,在实体“Race”中)由键值对 组成,这两个都是 JEE 中的自定义实体。

地图由“@ElementCollection”注释。

尝试将地图持久化到数据库时,会出现错误:“Data truncation: Data too long for column 'RACERS'”。

在检查数据库时,我们看到创建了一个表“Race_RACERS”,它由三列组成:两个 bigint(代表 Race 对象和 User 对象的 id)和一个 varchar,其中包含 Racestats 对象。

当然,最后一列还应该包含对 Racestats 的引用,而不是嵌入这些 Racestats 对象。

我们已经尝试使用其他几个注释来解决此问题,但它们似乎都不起作用。

谁能提供正确的语法来持久化我们的对象。

显然,每个地图中的键都是唯一的,但在不同的 Race 对象中,地图可能包含相同的键。

没有两个值是相同的。即使在不同的 Race 对象中,地图也永远不会包含相同的值。

【问题讨论】:

    标签: java mysql jakarta-ee jpa


    【解决方案1】:

    我没有关于您的用例的所有信息,但在我看来,将 User 引用放在 Racestats 实体中会更简单,例如:

    @Entity
    public class Race {
        @OneToMany(mappedBy="race")
        Set<Racestats> racestats;
    }
    
    @Entity
    public class Racestats {
        @ManyToOne
        User user;
    
        @ManyToOne
        Race race;
    
        // Other race stats fields
        ...
    }
    

    【讨论】:

    • 应该可以获取某个用户的 RaceStat。如果按照您的建议实施,我们必须遍历所有 RaceStats 以找出哪个属于正确的用户。这对我来说似乎并不理想......
    • 您知道在保留 User-RaceStats-Map 的同时解决我的问题的正确方法吗?当简单地给 Map 一个 OneToMany 注释时,我们会得到 EclipseLink 异常:“表 [RACESTATS] 不在此描述符中。”和“必须为序列号字段定义非只读映射。”。
    • 抱歉,如果我没有回答您的问题,但我看不到使用实体地图的方法。该映射在 java 中可能是一个很好的构造,但它不是使用 JPA 将实体映射到数据库的标准方法。
    猜你喜欢
    • 2010-10-08
    • 2017-04-22
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多