首页
学习
活动
专区
圈层
工具
发布

JPA的JPA
EN

Stack Overflow用户
提问于 2012-12-10 16:08:27
回答 2查看 616关注 0票数 0

我想知道的是:

我有一个仪表板类和一个用户类。在我的(Java项目) Java代码中,我希望获得用户已经订阅的所有仪表板。

数据库包含一个表(dashboard_users),包含以下字段: idUser、idDashboard、isDefault en ID。

我的问题是:

  • 这三个类之间的JPA连接应该如何类似于(Dashboard.java/User.java/UserDashboard.java)??

我学习了很多教程和例子,但出于某种原因,总是会出现错误或其他问题。如果有人能举个例子,我就能看出我做错了什么,这将是非常受欢迎的。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-10 20:43:54

您可以这样做的一种方法是将UserDashboard之间的关系看作一个映射,其中Dashboard是一个键,每个与User关联的Dashboard都有一个条目,并且值是一个标志,指示该Dashboard是否是该User的默认值。我承认这有点勉强,这是一种奇怪的方式来看待这段关系,也许甚至怀疑已经被指控。

但是,这个视图的优点是,它可以让您从这样的一切事物中映射出活的星光:

代码语言:javascript
复制
@Entity
public class Dashboard {

    @Id
    private int id;
    private String name;

    public Dashboard(int id, String name) {
        this.id = id;
        this.name = name;
    }

    protected Dashboard() {}

}

@Entity
public class User {

    @Id
    private int id;
    private String name;
    @ElementCollection
    private Map<Dashboard, Boolean> dashboards;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
        this.dashboards = new HashMap<Dashboard, Boolean>();
    }

    protected User() {}

    // disclaimer: the following 'business logic' is not necessarily of the finest quality

    public Set<Dashboard> getDashboards() {
        return dashboards.keySet();
    }

    public Dashboard getDefaultDashboard() {
        for (Entry<Dashboard, Boolean> dashboard : dashboards.entrySet()) {
            if (dashboard.getValue()) {
                return dashboard.getKey();
            }
        }
        return null;
    }

    public void addDashboard(Dashboard dashboard) {
        dashboards.put(dashboard, false);
    }

    public void setDefaultDashboard(Dashboard newDefaultDashboard) {
        Dashboard oldDefaultDashboard = getDefaultDashboard();
        if (oldDefaultDashboard != null) {
            dashboards.put(oldDefaultDashboard, false);
        }
        dashboards.put(newDefaultDashboard, true);
    }

}

这映射了一个类似于这个Hibernate生成的SQL。的表结构,我认为这大概就是您想要的。User_dashboards表中生成的名称非常糟糕;您可以很容易地使用一些注释或一些XML来定制它们。就我个人而言,我喜欢将对象和数据库之间实际映射的所有肮脏细节保存在orm.xml中;下面是您需要添加的内容,以便使用更合理的名称:

代码语言:javascript
复制
<entity class="User">
    <attributes>
        <element-collection name="dashboards">
            <map-key-join-column name="Dashboard_id" />
            <column name="is_default" />
        </element-collection>
    </attributes>
</entity>
票数 1
EN

Stack Overflow用户

发布于 2012-12-10 16:19:59

考虑到关联表上的额外属性,您需要对其建模(按照您的要求通过UserDashboard.java类)。非常不幸,因为它为您的模型层增加了大量的工作。

如果您发现您毕竟不需要额外的属性,那么我将使用一组仪表板对用户建模,并通过@JoinTable直接链接。

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

https://stackoverflow.com/questions/13804643

复制
相关文章

相似问题

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