当前位置: 首页 > 面试题库 >

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

弓华茂
2023-03-14
问题内容

我有一个遗留数据库,我正在尝试将其重新设计成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 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:



 类似资料:
  • 问题内容: 我试图创建此代码以输入m x n矩阵。我打算输入,但是代码产生了。当我输入其他m×n矩阵时,也会发生相同的情况,代码会产生行数相同的m×n矩阵。 也许您可以帮助我找到我的代码有什么问题。 问题答案: 问题出在初始化步骤上。 这段代码实际上使您的每一行都引用相同的对象。如果任何列中的任何项目发生更改-其他所有列都将发生变化: 您可以在嵌套循环中初始化矩阵,如下所示: 或者,通过使用列表理

  • 我正在做一个2D游戏。我把游戏地图保存在一个名为gameMap的js对象{}上。我的问题是读取矩阵上的一个项目需要太长时间。对于冲突检测,我通常必须检查地图矩阵的10或20个项目,大约需要1ms,屏幕上有10个字符冲突检测成为应用程序的瓶颈,每帧应该持续16ms中的10ms。此外,当地图变得太大时,按比例放大。 假设地图有1000 x 1000个项目。现在,如果我想检查什么是在位置我检查。我的想法

  • 问题内容: 鉴于此CSV文件: 我只是想将其加载为3行7列的矩阵/ ndarray。但是,由于某种原因,我能从numpy中脱颖而出的是一个具有3行(每行一个)且没有列的ndarray。 我可以手动迭代并将其修改为所需的形状,但这似乎很愚蠢。我只想将其加载为适当的矩阵,以便可以像在matlab中一样将其切成不同的维度并进行绘制。 问题答案: 纯麻木 请查阅loadtxt文档。 您还可以使用pytho

  • 问题内容: 我试图计算二维二进制矩阵中的孤岛数量(一组相连的1组成一个孤岛)。 例: 在上面的矩阵中,有5个岛,分别是: 为了计算2D矩阵中的孤岛数量,我假设矩阵为图,然后使用DFS类型的算法对孤岛进行计数。 我一直在跟踪DFS(递归函数)调用的数量,因为在Graph中有很多组件。 下面是我为此目的编写的代码: 我传入参数的矩阵输出错误。我知道了,但是有集群。 我尝试调试任何逻辑错误的代码。但是我

  • 在我的数据库表中,我有一个列,它的内容可以是Y或N(CHECK约束)。我在Java中定义了一个String属性,在我的类中定义了一个基于String的setter。此外,为了方便起见,我添加了一个带有布尔参数的setter/getter。 那么,Hibernate基于什么属性进行映射呢?方法名称?参数名称?参数类型?在setter中使用可以吗?如果我的属性的名称与表列的名称不同,这会有什么不同吗?

  • 我有一个编码器BCH的输出矩阵(3,63),但这个矩阵是伽罗瓦域,我需要将这个伽罗瓦域转换为矩阵二进制,因为matlab将伽罗瓦域中的元素视为字符串,我需要将这些值视为二进制数。 我需要将代码列与000010进行比较,。。。对于开关情况或if,但代码矩阵行是伽罗瓦场格式。我的问题是,遵循matlab错误是开关表达式必须是标量或字符向量。