从Map创建JPA实体<string,string>表示数据库行</string,string>

时间:2014-04-03 17:48:29

标签: java entity-framework jpa map eclipselink

更新

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


问题

是否可以基于字段名称映射中的数据创建JPA实体类的实例,以表示数据库行的字符串值,这与实体管理器将数据库列名称的结果集转换为值的方式相同进入一个实体?

EclipseLink 2.4.1正在此项目中使用,可以使用特定于EclipseLink 2.4.1的可公开访问的方法。

情况

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

以表格形式返回数据:

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

我的代码中已将其转换为{&#34; id_column&#34; =&gt;&#34; 5&#34;和&#34; enum_column&#34; =&gt;&#34; VALUE_1&#34;}。

然后需要将其转换回实体,在此示例中为

*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();

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

1 个答案:

答案 0 :(得分:1)

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

但是你可以轻松地使用java反射来获得你想要的东西。 您解析地图并创建相关对象:地图的关键字是要查找的字段,值是要设置的值。

如果您需要一个示例,可以查找(联合国)编组过程。