如何将Java中的二维矩阵映射到Hibernate / JPA?

我有一个遗留数据库,我正在努力重新设计到21世纪。 现有数据结构之一涉及包含二维值矩阵的特定类。 如果我要从数据库中对这个类进行逆向工程,我最终会得到一系列属性,例如:

private BigDecimal NODE_1_MATRIX_POS_1_1; private BigDecimal NODE_1_MATRIX_POS_1_2; 

等等。 由于这是一个6×6矩阵,因此有很多这样的列。

我一直在寻找更好的方法,但我不确定我在那里。 我想做的是这样的:

 @Entity public class TestClass { @Id private long id; @CollectionOfElements @JoinTable( name="MATRIX_DATA", joinColumns=@JoinColumn(name="ENTRY_ID")) private List<List> matrix; 

但这失败了:

 org.hibernate.MappingException: Could not determine type for: java.util.List, at table: MATRIX_DATA, for columns: [org.hibernate.mapping.Column(element)] 

而不是仅仅试图修复错误,我想我会四处询问并尝试找到解决此映射挑战的正确方法 。 有没有人通过JPA找到成功和满意度映射多维数组?

而不是仅仅试图修复错误,我想我会四处询问并尝试找到解决此映射挑战的正确方法。 有没有人通过JPA找到成功和满意度映射多维数组?

标准JPA不支持AFAIK,嵌套集合。 JPA维基书有关于这个主题的很好的部分(我只引用了它的一部分):

嵌套集合,地图和矩阵

在对象模型中具有复杂的集合关系(例如List List (即矩阵),或MapMap ,或ListMap等)在某种程度上是常见的。 不幸的是,这些类型的集合很难映射到关系数据库。

JPA不支持嵌套集合关系,通常最好更改对象模型以避免它们使持久性和查询更容易。 一种解决方案是创建一个包装嵌套集合的对象。

例如,如果一个Employee有一个由项目类型键入的Project Map ,以及一个ListProject的值。 为了映射这个,可以创建一个新的ProjectType类来存储项目类型和OneToManyProject

那是我的建议。 例如:

 @Entity public class TestClass { @Id private long id; @OneToMany(mappedBy="testClass") private List matrix; } 

MatrixLine位置(省略许多细节):

 @Entity public class MatrixRow { @Id private long id; @ManyToOne private TestClass testClass; @CollectionOfElements private List row; } 

或者也许您可以使用自定义用户类型(我不太确定这将如何工作)。

或者(毕竟,你已经在使用非可移植注释)看看这个问题,看看如何扩展Hibernate:

  • 如何使用hibernate JPA注释映射嵌套集合Map>