【问题标题】:Get record from another table using JPA使用 JPA 从另一个表中获取记录
【发布时间】:2014-05-15 16:05:12
【问题描述】:

一段时间以来,我一直试图弄清楚如何做到这一点,但没有任何运气,并且在 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 中检索数据以填充 description 在 DAO 模型中酒店

【问题讨论】:

    标签: sql jpa jointable joincolumn


    【解决方案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

    【讨论】:

    • 请看我下面的评论!
    【解决方案2】:

    我会考虑放弃 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 ??
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2013-01-10
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2018-12-08
      • 2010-11-29
      相关资源
      最近更新 更多