Я строю веб-приложение с помощью рамки игры, и я бегу в проблемы с созданием модели базы данных с помощью этой схемыPlay Framework: отношение JPA «один ко многим» между тремя объектами?
**Client** – (many to many) – **Events**
\ /
(one to many) (one to many)
\ /
**COMMENTS**
Я могу создавать и добавлять отношения
Event event = new Event("Party");
Client client = new Client("[email protected]","fname","lname","street","phonenum");
Comment comment = new Comment("test comment!");
//Add relationships
client.addEvent(event);
event.addClient(client);
event.addComment(comment);
comment.addEvent(event);
event.addClient(client);
client.addComment(comment);
Но когда я пытаюсь сохранения данных
client.save();
event.save();
comment.save();
Я получаю ошибку
[error] Test CommentModelTest.testClientEventCommentRelationship failed:
javax.persistence.PersistenceException: org.h2.jdbc.JdbcSQLException: Unique index or primary
key violation: "PRIMARY_KEY_4A ON PUBLIC.EVENT_CLIENT(EVENT_ID, CLIENT_EMAIL)"; SQL statement:
[error] insert into event_client (client_email, event_id) values (?, ?) [23505-172]
Определения классов показаны ниже, я был бы очень признателен, если бы кто-то помог мне решить эту проблему. Я неправильно определяю отношения? Заранее спасибо!
Client Класс:
@Entity
public class Client extends Model {
@Id
public String email;
@Required
public String firstName;
@Required
public String lastName;
public String homeAddress;
public String phoneNumber;
@ManyToMany(mappedBy="clients", cascade=CascadeType.ALL)
public List<Event> events = new ArrayList<Event>();
@OneToMany(mappedBy="client", cascade=CascadeType.ALL)
public List<Comment> comments = new ArrayList<Comment>();
Класс событий:
@Entity
public class Event extends Model {
@Id
public Long id;
@Required
public String eventName;
@ManyToMany(cascade=CascadeType.ALL)
public List<Client> clients = new ArrayList<Client>();
@OneToMany(mappedBy="event", cascade=CascadeType.ALL)
public List<Comment> comments = new ArrayList<Comment>();
Комментарий Класс:
@Entity
public class Comment extends Model {
@Id
public Long id;
@Required
public String message;
@ManyToOne(cascade=CascadeType.PERSIST)
public Client client;
@ManyToOne(cascade=CascadeType.PERSIST)
public Event event;
--- Edit: ----------- --------------------
Я понял, где я ошибся. Если вы столкнулись с подобной ошибкой, проверьте, правильно ли используете модели! В моем тесте JUnit я попытался дважды добавить одного и того же клиента к событию, в результате чего дублируется первичный ключ (электронная почта).
исправленный код отношения должны быть следующими:
client.addEvent(event);
event.addClient(client);
event.addComment(comment);
comment.addEvent(event);
comment.addClient(client);
client.addComment(comment);
Благодарим за отзыв! Я понял, что я сделал неправильно всего несколько минут назад. Мои модели были построены правильно. Только мой тест Junit терпел неудачу, потому что я дублировал event.addClient (клиент); код дважды! я хотел бы добавить отношения между клиентом и событием, отношения «комментарий к клиенту» и отношения «комментарий к событию». Вышеприведенный код был отредактирован для работы :) – user3321616
Другое, что странно в вашей модели - это все операции 'cascade'. Убедитесь, что вы правильно поняли, что он делает. Например, если вы каскадируете операцию persistent на другой стороне, вам даже не нужно ее явно сохранять. –
Спасибо за подсказку! Я займусь этим. Я только начал изучать использование JPA и работать с базами данных, поэтому большинство моих знаний взяты из следующих уроков. Я обязательно удалю ненужные операции «каскада». Единственный ресурс, который я нашел для сохранения Java, - [link] (http://docs.oracle.com/javaee/6/tutorial/doc/giqst.html#giqsr). Вы знаете, где я могу узнать больше? – user3321616