我想知道的是:
我有一个仪表板类和一个用户类。在我的(Java项目) Java代码中,我希望获得用户已经订阅的所有仪表板。
数据库包含一个表(dashboard_users),包含以下字段: idUser、idDashboard、isDefault en ID。
我的问题是:
我学习了很多教程和例子,但出于某种原因,总是会出现错误或其他问题。如果有人能举个例子,我就能看出我做错了什么,这将是非常受欢迎的。
谢谢
发布于 2012-12-10 20:43:54
您可以这样做的一种方法是将User和Dashboard之间的关系看作一个映射,其中Dashboard是一个键,每个与User关联的Dashboard都有一个条目,并且值是一个标志,指示该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>发布于 2012-12-10 16:19:59
考虑到关联表上的额外属性,您需要对其建模(按照您的要求通过UserDashboard.java类)。非常不幸,因为它为您的模型层增加了大量的工作。
如果您发现您毕竟不需要额外的属性,那么我将使用一组仪表板对用户建模,并通过@JoinTable直接链接。
https://stackoverflow.com/questions/13804643
复制相似问题