【问题标题】:Creating a JPA Entity from a Map<String,String> representing a database row从表示数据库行的 Map<String,String> 创建 JPA 实体
【发布时间】:2014-11-01 01:15:02
【问题描述】:

更新

虽然我不会删除此问题,但如果提供的答案有助于将来帮助某人,则与此问题相关的项目因其他原因而被放弃。


问题

是否可以根据字段名称映射到表示数据库行的字符串值中的数据创建 JPA 实体类的实例,就像实体管理器将数据库列名称的结果集转换为值一样变成一个实体?

本项目使用的是 EclipseLink 2.4.1,可以使用特定于 EclipseLink 2.4.1 的可公开访问的方法。

情况

我正在使用一种 Web 服务,该服务将通过解释审核日志来检索一个或多个数据库行的状态,就像它们在时间 X 的状态一样。这可能不是正确的处理方式,但这是我可以使用的。

这会以以下形式返回数据:

{
    "id_column":{
        "value":"5"
        ...*snip*...
    },
    "enum_column":{
        "value":"VALUE_1"
        ...*snip*...
    },
}

这已在我的代码中转换为 {"id_column"=>"5" 和 "enum_column"=>"VALUE_1"} 的映射。

然后需要将其转换回实体,在本例中

*snip*

@Table(schema="stackoverflow", name="exampleEntity")
public class StackoverflowExampleEntity {
    @Id
    @Column(name="id_column")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id_column;

    @Enumerated(EnumType.STRING)
    @Column(name="enum_column")
    private StackOverflowExampleEnum enum_column;

    *snip*
}

这个过程需要是通用的,除了这个绊脚石之外,这应该是可能的。

背景

我试图深入研究 EclipseLink 源代码,但无法找到实际在行数据和实体之间进行转换的代码部分。

我知道以下将实现我的目标,但它涉及到不必要的数据库之旅,并且涉及将潜在的不安全信息嵌入到 SQL 查询中(因此存在潜在的 SQL 注入风险)

Object o = em.createNativeQuery("SELECT '5' AS id_column, 'VALUE_1' AS enum_column", StackoverflowExampleEntity .class).getSingleResult();

我也可以创建实体并使用设置器,但是 a.) 这不是通用解决方案,并且 b.) 需要手动将属性从字符串转换为属性类型,这是 JPA 实体管理器已经做过并且知道的事情如何处理托管实体。

【问题讨论】:

    标签: java entity-framework jpa map eclipselink


    【解决方案1】:

    我不认为你能找到你想要的东西...... EclipseLink(或任何其他框架)中的过程比这更复杂。

    但是你可以很容易地在 java 中使用反射来得到你想要的。 您解析地图并创建相关对象:地图的键是要查找的字段,值是要设置的值。

    如果需要示例,可以查找(取消)编组过程。

    【讨论】:

    • 在这种情况下仅使用普通反射并不理想的原因是必须编写大量代码来遵循现有的 JPA 注释,例如转换器。 - EclipseLink 已经埋在其中的代码。 (还是)感谢你的建议。最后,由于它的其他部分非常缓慢,这个项目无论如何都被放弃了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2010-10-25
    • 2014-06-25
    • 2020-03-10
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多