2014-02-18 4 views
0

Я строю веб-приложение с помощью рамки игры, и я бегу в проблемы с созданием модели базы данных с помощью этой схемы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); 

ответ

0

Исключение говорит, что вы пытаетесь добавить те же самые отношения дважды.

"PRIMARY_KEY_4A ON PUBLIC.EVENT_CLIENT(EVENT_ID, CLIENT_EMAIL)"

Я предполагаю, что это на столе между events и clients, поэтому он отображает ManyToMany отношения.

client.addEvent(event); 
HERE --> event.addClient(client); 

event.addComment(comment); 
comment.addEvent(event); 

HERE --> event.addClient(client); 
client.addComment(comment); 

Это добавлено дважды, и существует уникальный индекс, который предотвращает это.

+0

Благодарим за отзыв! Я понял, что я сделал неправильно всего несколько минут назад. Мои модели были построены правильно. Только мой тест Junit терпел неудачу, потому что я дублировал event.addClient (клиент); код дважды! я хотел бы добавить отношения между клиентом и событием, отношения «комментарий к клиенту» и отношения «комментарий к событию». Вышеприведенный код был отредактирован для работы :) – user3321616

+0

Другое, что странно в вашей модели - это все операции 'cascade'. Убедитесь, что вы правильно поняли, что он делает. Например, если вы каскадируете операцию persistent на другой стороне, вам даже не нужно ее явно сохранять. –

+0

Спасибо за подсказку! Я займусь этим. Я только начал изучать использование JPA и работать с базами данных, поэтому большинство моих знаний взяты из следующих уроков. Я обязательно удалю ненужные операции «каскада». Единственный ресурс, который я нашел для сохранения Java, - [link] (http://docs.oracle.com/javaee/6/tutorial/doc/giqst.html#giqsr). Вы знаете, где я могу узнать больше? – user3321616

Смежные вопросы