将两个字段映射到一个数据库列
Map two fields to one database column
问题: 我是否能够以某种方式将我的实体 class 的两个字段映射到数据库中的一个列?
场景:数据库没有完全规范化。存在一个包含复合信息的列。这不是我的实际用例,但一个易于理解的示例可能是平面中某个点的 X 和 Y 坐标。因此数据库可能包含一个字符串 12:45
而实体 class 应该只包含两个整数字段 x
宽度值 12
和 y
值 45
.
目前,实体 class 只有两个额外的 getter 和 setter 用于 x 和 y,并执行正确的翻译。但我想知道是否有办法让 JPA 在后台神奇地为我做这件事。
我已经在使用自定义转换器 classes,例如用于枚举和数据库列之间的正确映射,但这仅适用于实体 class 中的字段与数据库中的列之间的 "one-to-one" 映射。
当然,重新设计数据库中的 table 是最可取的方法,但目前还不行。
供应商特定的解决方案也可以。
2 将实体字段转换为一个数据库列可以相当简单地通过指定 JPA 使用实体中的访问器来处理转换:
@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 之外。
问题: 我是否能够以某种方式将我的实体 class 的两个字段映射到数据库中的一个列?
场景:数据库没有完全规范化。存在一个包含复合信息的列。这不是我的实际用例,但一个易于理解的示例可能是平面中某个点的 X 和 Y 坐标。因此数据库可能包含一个字符串 12:45
而实体 class 应该只包含两个整数字段 x
宽度值 12
和 y
值 45
.
目前,实体 class 只有两个额外的 getter 和 setter 用于 x 和 y,并执行正确的翻译。但我想知道是否有办法让 JPA 在后台神奇地为我做这件事。
我已经在使用自定义转换器 classes,例如用于枚举和数据库列之间的正确映射,但这仅适用于实体 class 中的字段与数据库中的列之间的 "one-to-one" 映射。
当然,重新设计数据库中的 table 是最可取的方法,但目前还不行。
供应商特定的解决方案也可以。
2 将实体字段转换为一个数据库列可以相当简单地通过指定 JPA 使用实体中的访问器来处理转换:
@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 之外。