首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA - @MapKey和@EmbeddedId

JPA - @MapKey和@EmbeddedId
EN

Stack Overflow用户
提问于 2015-03-21 09:47:49
回答 2查看 2.3K关注 0票数 1

我有以下DB结构:

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

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

代码语言:javascript
复制
@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;

    ...
}

但是当我尝试获得节日实体时,我有一个例外:

代码语言:javascript
复制
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'translatio0_.ID' in 'field list'

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

代码语言:javascript
复制
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的一部分?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-22 00:18:48

示例方法可以如下所示:

代码语言:javascript
复制
@Embeddable
public class FestivalId implements Serializable {
    @Column(name = "FESTIVAL_ID")
    private int id;
    ...
}
代码语言:javascript
复制
@Embeddable
public class FestivalTranslationId implements Serializable {
    @Embedded
    private FestivalId festivalId;

    @Column(name = "LANG")
    private String lang;
    ...
}
代码语言:javascript
复制
@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;
    ...
}
代码语言:javascript
复制
@Entity
@Table(name = "FESTIVAL_TRANSLATION")
public class FestivalTranslation {
    @EmbeddedId
    private FestivalTranslationId festivalTranslationId;

    @ManyToOne
    private Festival festival;
    ...
}

上述实体编制了以下表格:

代码语言:javascript
复制
FESTIVAL            FESTIVAL_TRANSLATION
--------            --------------------
ID    PK            FESTIVAL_ID    FK PK
                    LANG              PK

用Hibernate 4.3.8进行测试。

票数 0
EN

Stack Overflow用户

发布于 2015-03-21 16:18:00

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

有一个非常类似的问题描述了这里。但是,看起来可能存在一些问题,因为lang映射既存在于映射的键中,也存在于映射的值中(这取决于实际使用的JPA提供程序--Hibernate中存在问题)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29181304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档