JPA POJO объединенной таблицы на Java
Я хотел бы осознать следующее:
У меня есть класс панели инструментов и пользовательский класс. В моем (Java EE project) Java-коде я хотел бы получить все инструментальные панели, на которые подписан пользователь.
База данных содержит таблицу (dashboard_users) со следующими полями: idUser, idDashboard, isDefault en ID. Должен также быть Java POJO объединенной таблицы.
Мой вопрос:
- Как должно выглядеть соединение JPA MM между этими тремя классами (Dashboard.java/User.java/UserDashboard.java)?
Я следовал много учебников и примеров, но по какой-то причине всегда есть ошибки или другие проблемы. Было бы очень приятно, если бы кто-то мог привести пример, чтобы я мог видеть, что я делаю неправильно.
Спасибо
2 ответа
Один из способов сделать это - увидеть отношения между 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 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>
Учитывая дополнительный атрибут в таблице ассоциации, вам нужно его смоделировать (через UserDashboard.java
класс как ты просил). Весьма прискорбно, так как это добавляет значительный объем работы вашему слою модели.
Если вы обнаружите, что вам не нужен дополнительный атрибут, то я бы смоделировал пользователя с набором панелей мониторинга, связанных напрямую через @JoinTable
,