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>