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) 个答案