将两个字段映射到一个数据库列
Posted
技术标签:
【中文标题】将两个字段映射到一个数据库列【英文标题】:Map two fields to one database column 【发布时间】:2016-09-30 06:08:34 【问题描述】:问题:我是否能够以某种方式将我的实体类的两个字段映射到数据库中的一个列?
场景:数据库未完全规范化。存在一个包含复合信息的列。这不是我的实际用例,但一个易于理解的示例可能是平面中某个点的 X 坐标和 Y 坐标。所以数据库可能包含一个字符串12:45
,而实体类应该只包含两个整数字段x
,宽度值12
和y
,值45
。
目前,Entity 类只有两个用于 x 和 y 的额外 getter 和 setter,并执行正确的转换。但我想知道是否有办法让 JPA 在后台神奇地为我做这件事。
我已经在使用自定义转换器类,例如用于枚举和数据库列之间的正确映射,但这仅适用于实体类中的字段和数据库中的列之间的“一对一”映射。
当然,重新设计数据库中的表是最可取的方式,但目前不是一个选择。
供应商特定的解决方案也可以。
【问题讨论】:
从未听说过,但我能知道什么,我是约翰·斯诺。 【参考方案1】: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 之外。
【讨论】:
以上是关于将两个字段映射到一个数据库列的主要内容,如果未能解决你的问题,请参考以下文章
将 PostgreSQL JSON 列映射到 Hibernate 实体属性
使用 Fluent NHibernate 有条件地将两列映射到一个字段
将 hasMany = [field:String] 映射到数据库字段 TEXT