我有一个遗留数据库,我正在尝试将其重新设计成21世纪。现有的数据结构之一涉及一个特定的类,该类包含一个二维值矩阵。如果要从数据库中对该类进行逆向工程,则最终会得到一系列属性,例如:
private BigDecimal NODE_1_MATRIX_POS_1_1; private BigDecimal NODE_1_MATRIX_POS_1_2;
等等。由于这是一个6x6的矩阵,因此有很多这样的列。
我一直在寻找更好的方法,但是我不确定我在那儿。我想做的是这样的:
@Entity public class TestClass { @Id private long id; @CollectionOfElements @JoinTable( name="MATRIX_DATA", joinColumns=@JoinColumn(name="ENTRY_ID")) private List<List<BigDecimal>> 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映射多维数组成功和满意?
AFAIK,标准JPA不支持嵌套集合。JPA Wiki书中有一个很好的章节介绍了这个主题(我只引用了其中的一部分):
嵌套的集合,地图和矩阵 在对象模型中,通常具有复杂的集合关系,例如的a List的 Lists(即矩阵)或的a Map的 Maps或Map的Lists的a 等等。不幸的是,这些类型的集合很难映射到关系数据库。 JPA不支持嵌套的集合关系,通常最好更改对象模型,以避免它们使持久性和查询更容易。 一种解决方案是创建一个包装嵌套集合的对象。 例如,如果一个Employee有一个 Map的Project由一个键控小号 String项目类型和值的 List或Project秒。为了对此进行映射ProjectType,可以创建一个新类来存储project- type和OneToManyto Project。 …
嵌套的集合,地图和矩阵
在对象模型中,通常具有复杂的集合关系,例如的a List的 Lists(即矩阵)或的a Map的 Maps或Map的Lists的a 等等。不幸的是,这些类型的集合很难映射到关系数据库。
List
Map
JPA不支持嵌套的集合关系,通常最好更改对象模型,以避免它们使持久性和查询更容易。 一种解决方案是创建一个包装嵌套集合的对象。
例如,如果一个Employee有一个 Map的Project由一个键控小号 String项目类型和值的 List或Project秒。为了对此进行映射ProjectType,可以创建一个新类来存储project- type和OneToManyto Project。
Employee
Project
String
ProjectType
OneToMany
…
那就是我的建议。例如:
@Entity public class TestClass { @Id private long id; @OneToMany(mappedBy="testClass") private List<MatrixRow> matrix; }
MatrixLine将会在哪里(省略许多细节):
MatrixLine
@Entity public class MatrixRow { @Id private long id; @ManyToOne private TestClass testClass; @CollectionOfElements private List<BigDecimal> row; }
或者, 也许 您可以使用自定义用户类型(我不太确定这将如何工作)。
或者(毕竟,您已经在使用非便携式注释)看看这个问题,看看如何扩展Hibernate: