Java 带嵌入式的OneToMany不工作
我将SpringBoot1.3.1与Hibernate4.3.11和JPA一起使用。我有以下映射:Java 带嵌入式的OneToMany不工作,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我将SpringBoot1.3.1与Hibernate4.3.11和JPA一起使用。我有以下映射: @Entity public class Game { @EmbeddedId private GameId id; @Embedded private Prize prize; } @Embeddable public class Prize { private String name; @OneToMany @Cascade(CascadeType
@Entity
public class Game {
@EmbeddedId
private GameId id;
@Embedded
private Prize prize;
}
@Embeddable
public class Prize {
private String name;
@OneToMany
@Cascade(CascadeType.ALL)
private List<ImageReference> images;
}
@Entity
public class ImageReference {
@EmbeddedId
private ImageReferenceId id;
private ImageType type;
private ImageFormat format;
}
@Embeddable
public class GameId {
private UUID id;
}
@Emdeddable
public class ImageReferenceId {
private UUID id;
}
我在JPA规范中找不到如何将可嵌入类中的关系映射到DB的详细定义。在直接实体-一方关系(即多方上的外键)的情况下,如何映射它而不是连接表是默认的解决方案。您可以通过在
Prize
@OneToMany
@Cascade(CascadeType.ALL)
@JoinColumn(name="GAME_ID")
private List<ImageReference> images;
然后,game_images
表将过时
编辑:
Hibernate有一个bug,它要求您在可嵌入类中的关系上放置一个
@JoinColumn
注释(即使没有任何注释值)如果要使用@AssociationOverride
我在JPA规范中找不到如何将可嵌入类中的关系映射到DB的详细定义。在直接实体-一方关系(即多方上的外键)的情况下,如何映射它而不是连接表是默认的解决方案。您可以通过在Prize
@OneToMany
@Cascade(CascadeType.ALL)
@JoinColumn(name="GAME_ID")
private List<ImageReference> images;
然后,game_images
表将过时
编辑:
Hibernate有一个错误,要求您在可嵌入类中的关系上添加
@JoinColumn
注释(即使没有任何注释值),如果您想使用@AssociationOverride
请发布执行保存的代码以及嵌入ID的代码。什么是game\u图像
表?添加了代码。game\u images
表包含游戏id和图像引用id之间的关联,因此数据库知道哪些图像是什么游戏/奖品的一部分。在这种情况下,是连接表-您是如何配置该名称的?默认情况下,JPA提供商将把连接表命名为game\u image\u reference
。您是否有未显示的@JoinTable
批注?我没有配置名称,也没有@JoinTable批注。它似乎是游戏
与ImageReferences列表属性名称(图像
)的串联。如果我更改了该名称,则联接表的名称也会更改。请发布进行保存的代码以及嵌入ID的代码。什么是game\u图像
表?添加了代码。game\u images
表包含游戏id和图像引用id之间的关联,因此数据库知道哪些图像是什么游戏/奖品的一部分。在这种情况下,是连接表-您是如何配置该名称的?默认情况下,JPA提供商将把连接表命名为game\u image\u reference
。您是否有未显示的@JoinTable
批注?我没有配置名称,也没有@JoinTable批注。它似乎是游戏
与ImageReferences列表属性名称(图像
)的串联。如果我更改了该名称,联接表的名称也会更改。谢谢。但是,这会导致在我的image\u reference
表中出现一个GAME\u ID列,这是我不希望看到的,因为ImageReference对象不仅用于游戏/奖品对象,还用于其他对象。(顺便说一句,@AssociationOverride
替代方案似乎不起作用,它允许非法尝试使用mappedBy关联定义@JoinColumn:prize.images
)我添加了有关导致此异常的Hibernate错误的信息。我理解你为什么喜欢使用联合桌。也许我会研究更多如何修复它。谢谢你。但是,这会导致在我的image\u reference
表中出现一个GAME\u ID列,这是我不希望看到的,因为ImageReference对象不仅用于游戏/奖品对象,还用于其他对象。(顺便说一句,@AssociationOverride
替代方案似乎不起作用,它允许非法尝试使用mappedBy关联定义@JoinColumn:prize.images
)我添加了有关导致此异常的Hibernate错误的信息。我理解你为什么喜欢使用联合桌。也许我会调查更多如何修复它。
@Embedded
@AssociationOverride(name= "images", joinColumns = @JoinColumn(name="GAME_ID"))
private Prize prize;