有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA/Hibernate:保存一个实体,该实体包含一个实体列表,该列表包含一个对象层次结构中的2D对象数组

我正在努力坚持我的游戏课程,结构如下:

  • 一种班级游戏,包含一系列棋盘
  • Board实体类是一个2D字段数组,代表一个播放板
  • Field类是抽象的,有具体的子类,如Floor、Goal和Wall

我想要的是游戏和棋盘实体之间的一对多关系,以及棋盘类中作为嵌入属性的字段。为了嵌入这一点,我想编写自己的映射代码,将2D数组转换为表示字段的符号字符串,但如果不可能,那么我会使用单表策略保存层次结构

我仍在学习JPA/Hibernate,所以一下子就有太多的事情要我完全掌握如何解决这个问题

这就是我尝试过的:

为单板实现AttributeConverter

我了解到这是不可能的,因为AttributeConverter不能用于关系属性(JPA规范)

为字段[]实现AttributeConverter,并使其成为嵌入式属性

@Entity
@NoArgsConstructor
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Getter
    private Long id;

    @OneToMany(mappedBy = "game", cascade = CascadeType.ALL)
    @Getter
    private List<Board> boards = new ArrayList<>();
...
}
@Entity
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @ManyToOne()
    @JoinColumn(name="game_id")
    private Game game;

    @Embedded
    @Convert(converter = FieldsConverter.class, attributeName = "field")
    private Field[][] fields;

而FieldsConverter

@Converter
public class FieldsConverter implements AttributeConverter<Field[][], String> {

IntelliJ已经给出了一个“Embedded atribute type不应为字段[][]”错误,运行该错误会导致奇怪的ArrayIndexOutOfBoundsException(请参见https://pastebin.com/ZVbCGaGA了解完整的stacktrace)

自己编写JDBC映射

我自己也开始编写BoardRepository,在其中手动映射Fields属性,但后来我想起,那时我可能在游戏和Board之间没有管理关系,或者JPA提供的延迟加载,所以我在完全准备好之前就停止了

我读到的一个接近解决方案是:https://vladmihalcea.com/multidimensional-array-jpa-hibernate/,但我不确定如何使其适应嵌入的属性,以及对象实际上是对象层次结构的一部分

有谁能给我一些关于如何进行的建议吗


共 (0) 个答案