Я, хотя его простой, что я хочу, но я не могу найти решение для моей проблемы. Я использую playframework 1.2.3, и он использует Hibernate как JPA. Поэтому я думаю, что playframework не имеет ничего общего с проблемой.JPA сущность дизайн/не может удалить объект
У меня есть несколько классов (Я опускаю nonrelevant поля)
public class User {
...
}
public class Task {
public DataContainer dataContainer;
}
public class DataContainer {
public Session session;
public User user;
}
public class Session {
...
}
Так у меня есть связь от задачи к DataContainer и от DataContainer к Sesssion и DataContainer принадлежит пользователю. У DataContainers всегда может быть один и тот же пользователь, но для каждого экземпляра сеанс должен быть другим. И DataContainer задачи также должен быть разным в каждом случае. У DataContainer может быть Sesesion или нет (это optinal). Я использую только однонаправленный. Этого должно быть достаточно.
Другими словами: Каждая задача должна имеет один DataContainer. Каждый DataContainer должен имеет одного и того же пользователя и может иметь одну сессию.
Чтобы создать схему БД я использую JPA аннотации:
@Entity
public class User extends Model {
...
}
@Entity
public class Task extends Model {
@OneToOne(optional = false, cascade = CascadeType.ALL)
public DataContainer dataContainer;
}
@Entity
public class DataContainer extends Model {
@OneToOne(optional = true, cascade = CascadeType.ALL)
public Session session;
@ManyToOne(optional = false, cascade = CascadeType.ALL)
public User user;
}
@Entity
public class Session extends Model {
...
}
КСТАТИ: Модель представляет собой класс игры и обеспечивает основной идентификатор, пока тип.
Когда я создаю для каждой сущности какой-либо объект и «соединяю его», я имею в виду ассоциации, он отлично работает. Но когда я пытаюсь удалить сеанс, я получаю исключение нарушения ограничения, потому что DataContainer все еще ссылается на сеанс, который я хочу удалить.
Я хочу, чтобы сессия (поле) DataContainer была установлена равной нулю, поэтому внешний ключ (session_id) должен быть удален в базе данных. Это будет хорошо, потому что это необязательно.
Я не знаю, я думаю, что у меня много проблем. Использую ли я правую аннотацию @OneToOne
?
Я нашел в Интернете дополнительные аннотации и атрибуты: @JoinColumn
и атрибут mappedBy
для обратной связи. Но у меня его нет, потому что он не двунаправлен. Или является двунаправленным партнером. по существу?
Другая попытка была использовать @OnDelete(action = OnDeleteAction.CASCADE)
contraint изменился с NO ACTION
х годов, когда обновление или удаление в:
ADD CONSTRAINT fk4745c17e6a46a56 FOREIGN KEY (session_id)
REFERENCES annotation_session (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE;
Но в этом случае, когда я удалить сеанс, в DataContainer пользователя и удаляется. Это неправильно для меня.
EDIT: Я использую PostgreSQL 9, материал JDBC входит в игру, мой единственный дб конфигурации является
db=postgres://app:[email protected]:5432/app
Может быть, это работает: добавить '@OneToOne DataContainer' в' Session' и изменить атрибут сеанса из DataContainer в '@OneToOne (mappedBy = "dataContainer") '. Таким образом, класс 'DataContainer' больше не нуждается в столбце' session_id'. –