【问题标题】:JPA (EclipseLink), type handling without repeated @Converter annotations?JPA(EclipseLink),没有重复@Converter注释的类型处理?
【发布时间】:2011-02-10 19:27:08
【问题描述】:

是否可以通过 EclipseLink 将一个类设置为以特定方式序列化,而无需在每次使用时都对其进行标记?例如,假设我有一堂课:

class MyObj {
    private int a;
    private int b;

    public MyObj(int a, int b) {
        this.a = a;
        this.b = b;
    }

    ...
}

我希望将其作为字符串“a=1,b=2”存储在数据库的列中。我不希望它被序列化为一个 blob,而是真正最终成为 VARCHAR 列中的一个字符串。我可以使用转换器来做到这一点,但是我需要在使用该类的任何地方都有一个注释:

@Entity
class User {
    @Column(name="first")
    private MyObj one;

    @Column(name="second")
    private MyObj two;

    ...

}

上述方法不起作用,因为它不知道如何在没有注释的情况下转换类型 - 我希望能够有效地为该类型注册一个默认转换器。 (我尝试过使用 Serializable/Externalizable 没有成功,因为我最终尝试将一个字节数组插入到数据库中。)

这是否可能,无论是使用标准 JPA 还是 EclipseLink? Hibernate 似乎有类似@TypeDef 之类的东西,听起来它可能会完成这项工作,但我正在使用 EclipseLink。

【问题讨论】:

    标签: jpa eclipselink converter


    【解决方案1】:

    使用转换器是最好的方法。您可以定义一个 SessionCustomizer 来扫描您的项目并设置转换,或者创建您自己的自定义 ConversionManager,但最好在映射上明确设置转换器。

    【讨论】:

      【解决方案2】:

      似乎没有办法做到这一点,这似乎是一种耻辱。最后,我用转换注释类成员以显式使用。

      【讨论】:

        【解决方案3】:

        您可以使用标准类型制作 get 方法并自行转换。例如:

        @Entity 类用户 { @Column(name="first") 私人 MyObj 之一;

        public void setOne(String myObj){
             one = convert(myObj);
        }
        
        public String getOne(){
            return convertBack(one);
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 1970-01-01
          • 2016-01-13
          • 2021-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多