[英]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
形式存储在数据库中,例如RED
或WHITE
。
@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.