0

私が実現したいのは次のとおりです。

ダッシュボードクラスとユーザークラスがあります。私の(Java EEプロジェクト)Javaコードでは、ユーザーがサブスクライブしているすべてのダッシュボードを取得したいと思います。

データベースには、次のフィールドを持つテーブル(dashboard_users)が含まれています:idUser、idDashboard、isDefaultenID。結合されたテーブルのJavaPOJOも必要です。

私の質問:

  • これら3つのクラス間のJPAMM接続は(Dashboard.java/User.java/UserDashboard.java)のようになりますか?

私はたくさんのチュートリアルと例に従いましたが、何らかの理由で常にエラーやその他の問題があります。誰かが例を挙げてくれれば大歓迎ですので、私が間違っていることを見ることができます。

ありがとうございました

4

2 に答える 2

2

アソシエーションテーブルに追加の属性がある場合は、それをモデル化する必要がありUserDashboard.javaます(要求したクラスを介して)。モデルレイヤーにかなりの量の作業が追加されるため、非常に残念です。

結局、追加の属性が必要ないことがわかった場合は、を介して直接リンクされた一連のダッシュボードを使用してユーザーをモデル化します@JoinTable

于 2012-12-10T16:19:59.183 に答える
1

Userこれを行う1つの方法は、との間の関係を、がキーであり、に関連付けられたすべてのエントリがあり、値がそのデフォルトであるかどうかを示すフラグDashboardであるマップとして表示することです。私はこれが少し強制されていることを認めます。それは関係を見る奇妙な方法であり、おそらく起訴されたように疑わしいかもしれません。DashboardDashboardUserDashboardUser

ただし、このビューの利点は、次のようなすべてのものから生きている昼光をマッピングできることです。

@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;に保持するのが好きです。より賢明な名前を使用するために追加する必要があるものは次のとおりです。

<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 に答える