使用JPA从另一个表中获取记录

时间:2014-05-15 16:05:12

标签: sql jpa jointable joincolumn

我一直试图弄清楚如何在没有任何运气的情况下执行此操作,并且在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_id locale_id 检索表 DESCRIPTION 中的数据,以填充说明在DAO模型酒店

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ??
        }
    }