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

时间:2015-07-02 16:24:09

标签: java java-ee jpa jpa-2.0

JPA 2.1引入了一项不错的新功能Attribute Converter - 请参阅文章,例如在这里: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类本身。

2 个答案:

答案 0 :(得分:5)

我建议使用此列@Transient并添加另一个@Column作为awt.Color的字符串值,使用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;
}

答案 1 :(得分:1)

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

字段映射为:

private void Squadre_DataGrid_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.RightButton == MouseButtonState.Pressed)
        {
            //Context menu

        }
    }

然后我们有两个静态方法的util类

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

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

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