0

我想实现的是以下几点:

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

该数据库包含一个表 (dashboard_users),其中包含以下字段:idUser、idDashboard、isDefault 和 ID。还应该有一个连接表的 Java POJO。

我的问题:

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

我遵循了很多教程和示例,但由于某种原因,总是存在错误或其他问题。如果有人可以举个例子,那将是非常受欢迎的,所以我可以看到我做错了什么。

谢谢

4

2 回答 2

2

鉴于关联表上的额外属性,您将需要对其建模(通过UserDashboard.java您要求的类)。很不幸,因为它给你的模型层增加了大量的工作。

如果你发现你根本不需要额外的属性,那么我会使用一组仪表板对用户进行建模,通过@JoinTable.

于 2012-12-10T16:19:59.183 回答
1

User您可以这样做的一种方法是将和之间的关系Dashboard视为一个映射,其中Dashboard是一个键,每个Dashboard与 关联的条目都有一个条目User,值是一个标志,指示这是否Dashboard是该的默认值User。我承认这有点强迫;这是看待这种关系的一种奇怪的方式,甚至可能像被指控的那样怀疑。

但是这个视图的优点是它可以让你从这样的一切中映射出生活日光:

@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-generated SQL的表结构,我认为这大致是你想要的。桌子上生成的名字User_dashboards很粗制滥造;您可以使用一些注释或一些 XML 轻松自定义它们。就个人而言,我喜欢将对象和数据库之间实际映射的所有肮脏细节保存在orm.xml; 这是您需要添加的内容以使用更合理的名称:

<entity class="User">
    <attributes>
        <element-collection name="dashboards">
            <map-key-join-column name="Dashboard_id" />
            <column name="is_default" />
        </element-collection>
    </attributes>
</entity>
于 2012-12-10T20:43:54.220 回答