一尘不染

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

hibernate

我有一个遗留数据库,我正在尝试将其重新设计成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映射多维数组成功和满意?


阅读 273

收藏
2020-06-20

共1个答案

一尘不染

我想不仅要尝试解决错误,还应该四处询问并尝试找到解决此映射挑战的正确方法。有没有人发现通过JPA映射多维数组成功和满意?

AFAIK,标准JPA不支持嵌套集合。JPA Wiki书中有一个很好的章节介绍了这个主题(我只引用了其中的一部分):

嵌套的集合,地图和矩阵

在对象模型中,通常具有复杂的集合关系,例如的a ListLists(即矩阵)或的a Map
Maps或MapLists的a 等等。不幸的是,这些类型的集合很难映射到关系数据库。

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

例如,如果一个Employee有一个 MapProject由一个键控小号 String项目类型和值的
ListProject秒。为了对此进行映射ProjectType,可以创建一个新类来存储project-
type和OneToManyto Project

那就是我的建议。例如:

@Entity
public class TestClass {    
    @Id
    private long id;

    @OneToMany(mappedBy="testClass")
    private List<MatrixRow> matrix;
}

MatrixLine将会在哪里(省略许多细节):

@Entity
public class MatrixRow {
    @Id
    private long id;

    @ManyToOne
    private TestClass testClass;

    @CollectionOfElements
    private List<BigDecimal> row;
}

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

或者(毕竟,您已经在使用非便携式注释)看看这个问题,看看如何扩展Hibernate:

2020-06-20