1

一段时间以来,我一直试图弄清楚如何做到这一点,但没有任何运气,并且在 Google 上搜索时也没有找到任何有用的东西。

我有三张桌子:

HOTEL
 - id
 - name
 - local_id (foreign key)

DESCRIPTION
 - id
 - description
 - hotel_id (foreign key)
 - locale_id (foreign key)

LOCALE
 - id
 - local

我还有以下 HOTEL DAO 模型:

@Entity
@Table(name = "HOTEL")
public class Hotel implements Serializable {

    @Column(name = "id")
private long id;

    @Column(name = "description")
    private HotelDescription description;
}

使用 JPA,如何根据hotel_idlocale_id从表DESCRIPTION中检索数据以填充DAO 模型hotel中的描述

4

2 回答 2

1

好吧,您也有 HotelDescription JPA 实体,对吧?因此,您可以为实体定义双向映射。

代替

@Column(name = "description")
private HotelDescription description;

你应该有类似的东西

@OneToOne(mappedBy = "hotel", cascade = CascadeType.ALL)
private HotelDescription desc;

另一方面,在 HotelDescription 中你应该有回映射

@OneToOne
@JoinColumn(name = "hotel_id")
private Hotel hotel;

当您提取酒店实体时,JPA 还将为您获取子实体 (HotelDescription)。

如果您想使用@OneToMany 映射,它将是(一家酒店的许多描述)

@OneToMany(mappedBy = "hotel", cascade = CascadeType.ALL)
private HotelDescription desc;

而在另一边

@ManyToOne
@JoinColumn(name = "hotel_id")
private Hotel hotel;

在 JPA 中,您可以使用多种类型的映射,例如 OneToMany、ManyToMany... 这只是基础。找教程。您可以从这里开始: http: //docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html(可能不是最好的)

哦。并确保使用@Id 注释 id

于 2014-05-15T16:17:45.890 回答
0

我会考虑放弃 Locale 表并直接使用 java.util.Locale。Hibernate(不确定其他 JPA 实现)具有从 char 列到 java.util.Locale 的自动类型转换。这看起来像:

DESCRIPTION
 - id
 - description
 - hotel_id (foreign key)
 - locale

和实体:

import java.util.Locale;

@Entity
    @Table(name = "HOTEL")
    public class Hotel implements Serializable {

        @Column(name = "id")
        private long id;

        @OneToMany
        @JoinColumn(name = "holiday_id", nullable = false)
        @MapKeyColumn(name = "locale_id")
        private Map<Locale, HotelDescription> descriptions;

        public String getDescriptionForLocale(Locale locale){

            //try an exact match e.g. en_us
            if(descriptions.containsKey(locale){
                return descriptions.get(locale).getDescription();
            }
            //try language only e.g. en
            else if (decsriptions.containsKey(locale.getLanguage){
                return descriptions.get(locale.getlanguage()).getDescription();
            }

            //return a default or null
            return ??
        }
    }
于 2014-05-15T17:11:55.370 回答