JPA 2.1引入了一项不错的新功能Attribute Converter - 请参阅文章,例如在这里: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
类本身。
答案 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对你的类进行翻译
不确定是推荐的解决方案,但这是直接从现有系统复制的