User
これを行う1つの方法は、との間の関係を、がキーであり、に関連付けられたすべてのエントリがあり、値がそのデフォルトであるかどうかを示すフラグ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で生成された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>