Моя модель домена в приложении Java EE 6 содержит двунаправленные отношения, подобные следующим:
@Entity
public class Users implements PrimaryKeyHolder<String>, Serializable {
@Id
private String username;
@ManyToMany(mappedBy= "users")
private List<Category> categories;
public List<Category> getCategories() {
if (categories == null) {
categories = new ArrayList<Category>();
}
return Collections.unmodifiableList(categories);
}
public void addCategory(Category category) {
if (categories == null) {
categories = new ArrayList<Category>();
}
categories.add(category);
if (!category.getUsers().contains(this)) {
category.addUser(this);
}
}
public void removeCategory(Category category) {
if (categories == null) {
categories = new ArrayList<Category>();
}
categories.remove(category);
if (category.getUsers().contains(this)) {
category.removeUser(this);
}
}
public void setCategories(Collection<Category> categories) {
if (this.categories == null) {
this.categories = new ArrayList<Category>();
}
for (Iterator<Category> it = this.categories.iterator(); it.hasNext();) {
Category category = it.next();
it.remove();
if (category.getUsers().contains(this)) {
category.removeUser(this);
}
}
for (Category category : categories) {
addCategory(category);
}
}
}
@Entity
public class Category implements PrimaryKeyHolder<Long>, Serializable {
@Id
private Long id;
@ManyToMany
private List<User> users;
public List<User> getUsers() {
if (users == null) {
users = new ArrayList<User>();
}
return Collections.unmodifiableList(users);
}
protected void addUser(User user) {
if (users == null) {
users = new ArrayList<User>();
}
users.add(user);
}
protected void removeUser(User user) {
if (users == null) {
users = new ArrayList<User>();
}
users.remove(user);
}
}
ОБНОВЛЕНИЕ : я добавил код управления отношениями.Отношения устанавливаются только на стороне пользователя, поэтому методы добавления / удаления защищены в классе Категория.Я устанавливаю категории для пользователя через setCategories
.
. Eclipselink правильно генерирует таблицу соединений CATEGORY_USERS.Тем не менее, он не сохраняет никакой информации в нем (он только кэширует информацию).Например, когда я выполняю операцию поиска в менеджере сущностей (например, в пользователе), он возвращает полный граф объектов (включая отношение категории).Но когда я смотрю на таблицы, информация не обновляется (даже если транзакции зафиксированы).Я также вставил операцию очистки в мой код, но безуспешно.Основная информация (например, столбцы String, Integer и т. Д.) Корректно сохраняется и обновляется.После перевода уровня журнала в FINE я вижу, что никакие операторы SQL не выполняются для отношений и таблицы соединений соответственно.Но я вижу операторы SQL для однонаправленных отношений.
Моя модель данных покрыта обширными модульными тестами, которые все проходят успешно.Я в основном делаю ту же операцию, что и в контейнере, фиксирую транзакцию, перезагружаю сущности из БД и проверяю, правильно ли установлены отношения, какие они есть (я использую базу данных дерби в памяти для тестирования).
Мой сервер приложений - Glassfish v3.1-b17.
Любая помощь приветствуется.Спасибо, Тео