Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPA中模拟属性转换器<;=2.0?_Java_Jakarta Ee_Jpa_Jpa 2.0 - Fatal编程技术网

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

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中是否有获得类似结果的方法?我建

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中是否有获得类似结果的方法?我建议将此列
@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时遇到问题。