繁体   English   中英

如何在JPA <= 2.0中模拟属性转换器?

[英]How to emulate Attribute Converter in JPA <= 2.0?

JPA 2.1引入了一个很好的新功能属性转换器 - 请参阅此处的文章: http//www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

它允许您拥有某种类型的属性,并将其作为其他内容存储在数据库列中。 例如,您有一个字段颜色为java.awt.Color类型的实体,但您希望它以String形式存储在数据库中,例如REDWHITE

@Entity
class Tag {
    String name;
    java.awt.Color color; // I want it to be stored as a different type
}

有没有办法在JPA <= 2.0中获得类似的结果? 我想为一个不是 enum的类型做这件事。

我们不区分业务域层和@Entity类。 当然,如果它们之间存在某种映射,我可以想象许多可行的解决方案。 我正在寻找的是一种解决方案,我们直接在业务领域层中使用@Entity类。

我建议使用@Transient这一列并添加另一个@Column ,它将是awt.Color的String值,使用getter和setter作为转换器。

你的课将如下:

@Transient
java.awt.Color color;
@Column
String colorField;

每次使用Color时都使用setter,此setter将解码颜色并将其添加到colorField字段。

public setColor(java.awt.Color color){
  this.colorField = color.toString();
  this.color = color;
}

正如我在评论中提到的,在我工作的系统中,自定义非实体类被序列化为字节数组并作为blob放入db,并在使用前反序列化。

字段映射为:

 @Column(name = "data")
 private byte[] data;

那么我们有两个静态方法的util类

public static byte[] serialize(Object object) throws IOException,
            ClassNotFoundException {
        // Serialize to a byte array
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(object);
        out.close();

        // Get the bytes of the serialized object
        byte[] buf = bos.toByteArray();
        return buf;
    }

    public static Object deserialize(byte[] data) throws IOException,
            ClassNotFoundException {
        // Deserialize from a byte array
        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
                data));
        Object o = in.readObject();
        in.close();
        return o;
    }

现在你可以创建瞬态getter和setter,并使用derialize和deserialize对你的类进行翻译

不确定是否推荐解决方案,但这是直接从现有系统复制的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM