gpt4 book ai didi

java - JPA - @MapKey 和 @EmbeddedId

转载 作者:行者123 更新时间:2023-11-30 08:19:18 31 4
gpt4 key购买 nike

我有以下数据库结构:

Main table FESTIVAL

Table with translation

其中 FESTIVAL_ID 和 LANG 是复合 PK,FESTIVAL_ID 是 FESTIVAL 的 FK。

在我的 Java 代码中,我有以下实体:

@Embeddable
public class FestivalTranslationId {

@Column(name = "FESTIVAL_ID")
Long festivalId;

@Column(name = "LANG")
String lang;

...
}

public class FestivalTranslation {

@EmbeddedId
FestivalTranslationId id = new FestivalTranslationId();

@MapsId(value = "festivalId")
@ManyToOne
@JoinColumn(name = "FESTIVAL_ID", referencedColumnName = "ID")
Festival festival;

@Column(name = "LANG")
String lang;

...
}


@Entity
@Table(name = "FESTIVAL")
public class Festival {

@OneToMany(mappedBy = "festival")
@MapKey(name="lang")
Map<String, FestivalTranslation> translations;

...
}

但是当我尝试获取节日实体时,我遇到了异常(exception):

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'translatio0_.ID' in 'field list'

在 hibernate 日志中我看到疯狂的sql查询:

SELECT translatio0_.FESTIVAL_ID AS FESTIVAL1_14_0_,
translatio0_.FESTIVAL_ID AS FESTIVAL1_15_0_,
translatio0_.LANG AS LANG2_15_0_,
translatio0_.ID AS ID3_15_0_,
translatio0_.FESTIVAL_ID AS FESTIVAL1_15_1_,
translatio0_.LANG AS LANG2_15_1_,
translatio0_.ID AS ID3_15_1_
FROM FESTIVAL_TRANSLATION translatio0_
WHERE translatio0_.FESTIVAL_ID = ?

我的问题是,是否可以将 Map 用于具有 @EmbeddedId 的实体,其中键是复合 PK 的一部分?

最佳答案

如果您想访问lang属性(property)来自 Festival实体你不能直接这样做,因为没有 lang映射于Festival 。你必须这样做:@MapKey(name="id.lang")因为它是通过FestivalTranslationId访问的.

描述了一个非常相似的问题 here 。然而,看起来lang这一事实可能存在一些问题。映射同时存在于映射的键和值中(这取决于您使用的实际 JPA 提供程序 - Hibernate 中存在问题)。

关于java - JPA - @MapKey 和 @EmbeddedId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29181304/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com