Java 如何在JPA中模拟属性转换器<;=2.0?
JPA 2.1引入了一个很好的新功能-请参阅以下文章: 它允许您拥有特定类型的属性,并将其作为其他内容存储在数据库列中。例如,您有一个字段颜色为Java 如何在JPA中模拟属性转换器<;=2.0?,java,jakarta-ee,jpa,jpa-2.0,Java,Jakarta Ee,Jpa,Jpa 2.0,JPA 2.1引入了一个很好的新功能-请参阅以下文章: 它允许您拥有特定类型的属性,并将其作为其他内容存储在数据库列中。例如,您有一个字段颜色为java.awt.color类型的实体,但您希望它作为字符串存储在数据库中,例如红色或白色 @Entity class Tag { String name; java.awt.Color color; // I want it to be stored as a different type } 在JPA中是否有获得类似结果的方法?我建
java.awt.color
类型的实体,但您希望它作为字符串
存储在数据库中,例如红色
或白色
@Entity
class Tag {
String name;
java.awt.Color color; // I want it to be stored as a different type
}
在JPA中是否有获得类似结果的方法?我建议将此列
@Transient
,并添加另一列@column
,作为awt.Color的字符串值,使用getter和setter作为转换器
您的课程将如下所示:
@Transient
java.awt.Color color;
@Column
String colorField;
每次使用颜色时,使用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,并使用deralize和deserialize从类和到类进行转换
不确定这是不是推荐的解决方案,但这是直接从我之前工作的系统中的现有系统复制而来的,它们在每次使用前都会序列化类和反序列化字段。@user902383,您能更具体一点吗?我直接使用@Entity
类作为域类。如果域类与@Entity
类不同,我可以想象出一百万种解决方案。依赖于实现。有些早在那时就有了“类型转换器”。你没提到你的工作是什么implementation@NeilStockton,我更喜欢实现无关的解决方案。有趣的解决方案,虽然它不是我想要的-我不需要存储对象的内容,而是转换它。不过,你应该得到我的另外一点:)无论如何,这或多或少与Koitoer提到的相同,只是更具体。我这里的关键思想是使用@Transient
字段进行映射。抱歉,我误解了你的意思,这完全取决于你想存储/转换什么类型的对象。也许你可以使用枚举和枚举的注释做些什么,或者按照Koitoer的建议去做。只是一点小小的注释,您不需要临时字段颜色
只需创建临时设置器和获取器,您可以在其中自动进行转换。希望在谷歌上找到答案,因为人们在使用TOME时遇到问题。