Играть! JPA @ManyToMany bug - PullRequest
       3

Играть! JPA @ManyToMany bug

0 голосов
/ 27 января 2012

У меня есть три объекта: Пользователь , Команда и TeamInvite .Каждый Пользователь имеет по одному Team .Каждый Пользователь может пригласить других пользователей в свою Team , создав TeamInvite .Когда принимается TeamInvite , каждый Пользователь * Team * обновляется. TeamInvites не влияет на пользователей , только их команды .

@Entity
public class Team extends Model {
    @OneToOne
    public User user;

    @ManyToMany(cascade=CascadeType.ALL)   //I've also tried CascadeType.PERSIST
    public List<User> team = new ArrayList<User>();
}

@Entity
public class TeamInvite extends Model {
    @ManyToOne
    public User inviter;

    @ManyToOne
    public User invitee;

    public void fulfill() {
        Team team = Team.forUser(inviter);
        team.team.add(invitee);
        team.save();    //error gets thrown here

        team = Team.forUser(invitee);
        team.team.add(inviter);
        team.save();

        delete();
    }
}

Когда вызывается TeamInvite.fulfill(), я получаю следующую ошибку:

PersistenceException occured : org.hibernate.exception.SQLGrammarException: could not insert collection: [models.Team.team#2]

play.exceptions.JavaExecutionException: org.hibernate.exception.SQLGrammarException: could not insert collection: [models.Team.team#2]
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
    at Invocation.HTTP Request(Play!)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert collection: [models.Team.team#2]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
    ...
Caused by: org.hibernate.exception.SQLGrammarException: could not insert collection: [models.Team.team#2]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1243)
    at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:81)
    ...
Caused by: org.h2.jdbc.JdbcSQLException: Duplicate column name "TEAM_ID"; SQL statement:
insert into Team_dp_user (Team_id, team_id) values (?, ?) [42121-149]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
    at org.h2.message.DbException.get(DbException.java:167)
    ...

Я скопировал свою структуру аннотаций из демонстрации Yabe (в сообщениях есть набор тегов).Кто-нибудь знает, что я делаю не так?

1 Ответ

3 голосов
/ 27 января 2012

Полагаю, обратная сторона отношения Team.team также называется User.team. Если это так, у вас есть коллизия между именами столбцов в объединяемой таблице, потому что их форма по умолчанию - propertyName + "_id".

Итак, вам нужно изменить одно из имен свойств или переопределить имена столбцов по умолчанию с помощью @JoinTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...