【问题标题】:Hibernate: Mapping a one to many relationship on a legacy table that uses columns as rows for the one to many relationshipHibernate:在将列用作一对多关系的行的旧表上映射一对多关系
【发布时间】:2011-11-23 19:39:53
【问题描述】:

我正在处理无法更改的数据库中的表。该表有一个用户联系人列表,例如电子邮件、facebook、twitter 等。这些联系人中的每一个都有一个列。所以表格看起来像这样:

USER {
    user_id,
    email,
    facebook,
    twitter,
    ...
}

我需要将此数据库链接到使用 Spring/Hibernate 的应用程序。此应用程序期望与用户含义的关系是一对多的:

User {
    user_id,
    ...
}
Contacts {
    contact_id,
    user_id,
    type,
    value
}

如何使用休眠映射实现这种转换?

【问题讨论】:

    标签: hibernate mapping one-to-many


    【解决方案1】:

    只是不要将Contact 设为实体,而是将其设为POJO,并在User 的getContacts 方法中返回这些POJO 的列表:

    public List<Contact> getContacts() {
        List<Contact> result = new ArrayList<Contact>();
        if (this.facebook != null) {
            result.add(new Contact("facebook", this.getId(), this.facebook));
        }
        if (this.twitter != null) {
            result.add(new Contact("twitter", this.getId(), this.twitter));
        }
        // ...
        return result;
    }
    

    在联系人中有一个 ID 并没有什么意义,因为联系人不是一个实体。

    请注意,您的问题有点奇怪:通常,您根据底层数据库架构设计 Hibernate 实体。如果基础架构如您所描述,为什么要这样设计应用程序。没有多大意义。

    【讨论】:

    • 该应用程序可以从各种数据库中挖掘数据。它对数据库一无所知。我们使用 hibernate 将数据库映射到应用程序可以理解的 POJO。我们当然有很多方法可以通过代码更改来解决这个问题。但是,我希望通过休眠映射无缝地做到这一点。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多