2012-03-26 8 views
12

У меня есть модель под названием «EventCheckin», которая имеет сопоставление ManyToOne с «Событием» и «Пользователь». PrimaryKey таблицы EventCheckin - это идентификатор пользователя и идентификатор события. Я пытаюсь представить это с помощью «EmbeddedId» в моей EventCheckin модели, но при попытке сохранить EventCheckin он пытается поставить user_id и event_id значения в таблицу дважды, которые, очевидно, не удается: классПовторяющиеся столбцы при использовании EmbeddedId с сопоставлением ManyToOne с Ebean

Caused by: org.h2.jdbc.JdbcSQLException: Duplicate column name "USER_ID"; SQL statement: 
insert into eventCheckin (event_id, user_id, latitude, longitude, user_id, event 
_id) values (?,?,?,?,?,?) [42121-158] 

EventCheckin :

@Entity 
@Table(name="eventCheckin") 
public class EventCheckin extends Model 
{ 
    @EmbeddedId public CheckinId id; 

    @MapsId("userId") 
    @JoinColumn(name="user_id") 
    @ManyToOne public User user; 

    @MapsId("eventId") 
    @JoinColumn(name="event_id") 
    @ManyToOne public Event event; 

    ..... 
} 

CheckinId EmbeddedId класс ::

@Embeddable 
public class CheckinId implements Serializable 
{ 
    public Long eventId; 
    public String userId; 
    ..... 
} 

И моя таблица базы данных для EventCheckin определяется следующим образом:

create table eventCheckin (
    user_id     varchar(255) not null, 
    event_id     bigint not null, 
    latitude     float, 
    longitude     float, 
    constraint pk_eventCheckIn primary key (user_id,event_id), 
    foreign key (user_id) references user (email), 
    foreign key (event_id) references event (id) 
); 
+0

Это учебное пособие пример '@ MapsId', написаны правильно, и должен работать как OpenEJB, так и Hibernate. – YoYo

ответ

2

Похоже, вы пытаетесь сделать то же самое через @MapsId и @EmbeddedId. Один из вариантов (работа) должны идти на IdClass (равнозначный, хэш-код, дополнительные атрибуты и т.д. вырезаны):

@Entity 
    public class User { 
     @Id public String id; 
    } 

    @Entity 
    public class Event { 
     @Id public long id; 
    } 

    public class CheckinId implements Serializable { 
     public Long event; 
     public String user; 
    } 

    @Entity 
    @IdClass(CheckinId.class) 
    @Table(name="eventCheckin") 
    public class EventCheckin { 

     @Id 
     @JoinColumn(name="user_id") 
     @ManyToOne public User user; 

     @Id 
     @JoinColumn(name="event_id") 
     @ManyToOne public Event event; 
    } 
+0

Спасибо! Но когда я это делаю, у меня все еще есть та же проблема. При попытке получить EventCheckin я получаю сообщение об ошибке, которое, как представляется, показывает, что выбор не выполняет объединение таблиц: Вызвано: org.h2.jdbc.JdbcSQLException: Столбец «T0.NAME» не найден; SQL stateme нт: выберите t0.name c0, c1 t0.password, t0.name c2, c3 t0.description, t0.latitude c4 , t0.longitude c5 от eventCheckin t0 где t0.user_id =? [42122-158] – InPursuit

+0

Это странно. Возможно, эта проблема является чем-то специфичным для Play/Ebean. С бледным Hibernate/EclipseLink над кодом работает. –

+0

Я начинаю думать, что это возможно. На данный момент я добавил столбец идентификаторов в EventCheckin, но это расстраивает то, что я пытаюсь сделать, это не работает. еще раз спасибо! – InPursuit

0

Этой ошибка возникает из-за колоннами user_id и event_id используется составным ключом и в то же время они используется @ManyToOne сопоставлений. Решение состоит в том, чтобы добавить insertable = false, updatable = false атрибутов к @Joincolumn annotaion. Вот рабочий код для этого решения:

EventChekin.java:

@Entity 
@Table(name="eventCheckin") 
public class EventCheckin extends Model { 

    public EventCheckin() { 
     id = new CheckinId(); 
    } 

    @EmbeddedId 
    public CheckinId id; 

    @ManyToOne 
    @MapsId("userId") 
    @JoinColumn(name="user_id", insertable = false, updatable = false) 
    private User user; 

    @ManyToOne 
    @MapsId("eventId") 
    @JoinColumn(name="event_id", insertable = false, updatable = false) 
    private Event event; 

    public void setUser(User aUser) { 
     user = aUser; 
     id.userId = aUser.getId(); 
    } 

    public void setEvent(Event aEvent) { 
     event = aEvent; 
     id.eventId = aEvent.getId(); 
    } 
} 

Checkin.java

@Embeddable 
public class CheckinId implements Serializable { 

    public Long eventId; 
    public String userId; 

    @Override 
    public int hashCode() { 
     return eventId.intValue() + userId.length(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     CheckinId c = (CheckinId)obj; 
     if(c==null) 
     return false; 
     if (c.eventId.equals(eventId) && c.userId.equals(userId)) { 
      return true; 
     } 
     return false; 
    } 
} 

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

  • Нет связанных вопросов^_^