如何在 JPA <= 2.0 中模拟属性转换器?
How to emulate Attribute Converter in JPA <= 2.0?
JPA 2.1 引入了一个不错的新特性Attribute Converter - see an article e.g. here: 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
的字符串值,使用 getter 和 setters 作为转换器。
您的 class 将是这样的:
@Transient
java.awt.Color color;
@Column
String colorField;
每次使用颜色时使用 setter,此 setter 将解码颜色并将其添加到 colorField 字段。
public setColor(java.awt.Color color){
this.colorField = color.toString();
this.color = color;
}
正如我在评论中提到的,在我工作的系统中,自定义非实体 class 被序列化为字节数组并作为 blob 放入数据库,并在使用前反序列化。
字段映射为:
@Column(name = "data")
private byte[] data;
然后我们有了 util class 和两个静态方法
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 并使用反序列化和反序列化在您的 class
之间进行转换
不确定是否推荐解决方案,但这是直接从现有系统复制而来[=12=]
JPA 2.1 引入了一个不错的新特性Attribute Converter - see an article e.g. here: 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
的字符串值,使用 getter 和 setters 作为转换器。
您的 class 将是这样的:
@Transient
java.awt.Color color;
@Column
String colorField;
每次使用颜色时使用 setter,此 setter 将解码颜色并将其添加到 colorField 字段。
public setColor(java.awt.Color color){
this.colorField = color.toString();
this.color = color;
}
正如我在评论中提到的,在我工作的系统中,自定义非实体 class 被序列化为字节数组并作为 blob 放入数据库,并在使用前反序列化。
字段映射为:
@Column(name = "data")
private byte[] data;
然后我们有了 util class 和两个静态方法
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 并使用反序列化和反序列化在您的 class
之间进行转换不确定是否推荐解决方案,但这是直接从现有系统复制而来[=12=]