我有以下DB结构:


其中FESTIVAL_ID和LANG是复合PK,FESTIVAL_ID是节日的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;
...
}但是当我尝试获得节日实体时,我有一个例外:
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 = ?我的问题是,对于@EmbeddedId的实体是否可以使用Map,其中key是复合PK的一部分?
发布于 2015-03-22 00:18:48
示例方法可以如下所示:
@Embeddable
public class FestivalId implements Serializable {
@Column(name = "FESTIVAL_ID")
private int id;
...
}@Embeddable
public class FestivalTranslationId implements Serializable {
@Embedded
private FestivalId festivalId;
@Column(name = "LANG")
private String lang;
...
}@Entity
@Table(name = "FESTIVAL")
public class Festival {
@EmbeddedId
@AttributeOverride(name = "id", column = @Column(name = "ID"))
private FestivalId festivalId;
@MapsId(value = "festivalId")
@OneToMany(mappedBy = "festival")
@MapKey(name = "festivalTranslationId")
private Map<String, FestivalTranslation> translations;
...
}@Entity
@Table(name = "FESTIVAL_TRANSLATION")
public class FestivalTranslation {
@EmbeddedId
private FestivalTranslationId festivalTranslationId;
@ManyToOne
private Festival festival;
...
}上述实体编制了以下表格:
FESTIVAL FESTIVAL_TRANSLATION
-------- --------------------
ID PK FESTIVAL_ID FK PK
LANG PK用Hibernate 4.3.8进行测试。
发布于 2015-03-21 16:18:00
如果您想从lang实体访问Festival属性,就不能直接这样做,因为Festival中没有lang映射。您必须这样做:@MapKey(name="id.lang"),因为它是通过FestivalTranslationId访问的。
有一个非常类似的问题描述了这里。但是,看起来可能存在一些问题,因为lang映射既存在于映射的键中,也存在于映射的值中(这取决于实际使用的JPA提供程序--Hibernate中存在问题)。
https://stackoverflow.com/questions/29181304
复制相似问题