将两个字段映射到一个数据库列

时间:2016-09-30 06:08:34

标签: jpa eclipselink jpa-2.0 jpa-2.1

问题:我能以某种方式将我的Entity类的两个字段映射到数据库中的一个列吗?

场景:数据库未完全规范化。存在一个包含复合信息的列。这不是我的实际用例,但可理解的示例可能是平面中某点的X坐标和Y坐标。因此,数据库可能包含字符串12:45,而实体类应仅包含两个整数字段x宽度值12y,其值为45

目前,Entity类只有两个额外的x和y的getter和setter,并执行正确的转换。但我想知道是否有办法让JPA在后台神奇地为我做这件事。

我已经在使用自定义转换器类,例如用于在枚举和数据库列之间进行适当的映射,但这仅适用于Entity类中的字段与数据库中的列之间的“一对一”映射。

当然,这将是在数据库中重新设计表格的最佳方式,但目前不是一种选择。

供应商特定的解决方案也很好。

1 个答案:

答案 0 :(得分:1)

通过指定JPA在实体中使用您的访问者来处理转换,可以非常简单地将2个实体字段放入一个数据库列中:

@Entity
@Access(AccessType.FIELD)
class myEntity {
@Id
int id;
@Transient
String x;
@Transient
String y;

@Mutable //EclipseLink specific to prevent change tracking issues
@Access(AccessType.PROPERTY)
@Column(name="yourDatabaseFieldName")
private String getCoords() {
 return x+":"+y;
}
private void setCoords(String coords) {
  //parse the string and set x+y.
}

EclipseLink和Hibernate具有能够处理反向的转换映射;将2个或更多数据库字段放入一个java属性中,但这不在JPA中。