JPA, повторяющаяся запись при сохранении в соединительной таблице при использовании отношения @ManyToMany - PullRequest
1 голос
/ 02 июля 2011

Я хочу создать пользовательскую аутентификацию JAAS, в которой мои отношения с пользователями и принципалами определены в JPA, как показано:

class AuthUser

public class AuthUser implements Serializable {

    // own properties
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int uid;

    @Column(name="NAME",unique=true)
    private String name;

    // Join classes
    @ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.MERGE})
    @JoinColumn(name="PRINCIPALS_PRINCIPAL")
    private Set<AuthPrincipal> principals;
}

classAuthPrincipal

public class AuthPrincipal implements Serializable {

    // Defining roles
    public enum Principal {
        AUTHUSER, STUDENT, ADMINISTRATOR, TEACHER
    }

    @Id
    @Enumerated(EnumType.STRING)
    @Column(name="PRINCIPAL")
    private Principal principal;

    @ManyToMany(mappedBy = "principals")
    @JoinColumn(name="USERS_USER")
    private Set<AuthUser> users;
}

Сопоставление со следующим определением таблицы

Table authprincipal
===================
PRINCIPAL        varchar(255) PK

Table authuser
==============
UID              int(11)      PK
EMAIL            varchar(255)
NAME             varchar(255)
PASSWORD         varchar(255)

Table authuser_authprincipal
============================
users_UID            int(11)      PK
principals_PRINCIPAL varchar(255) PK

Теперь я создал файл JSF, из которого я вызываю метод действия, который вызываетвот этот:

    public void createUser(AuthUser newUser) throws UserNameExistsException, UserEmailExistsException {
    AuthPrincipal role = authRoleFacade.find(AuthPrincipal.Principal.AUTHUSER);
    if( role == null ){
        role = new AuthPrincipal();
        role.setPrincipal(AuthPrincipal.Principal.AUTHUSER);
        authRoleFacade.create(role);
    }    
    authUserFacade.create(newUser);
    addPrincipalToUser(newUser, role);
}

Актуальная проблема Я могу создать первого пользователя.Но я не могу создать второго пользователя.Обратите внимание, что у второго пользователя я использую существующий объект роли и только каскадирую операцию слияния.

Самое странное, что он говорит, что дублирует ключ 2-AUTHUSER, где 2 - это идентификатор нового пользователя, поэтомууже не может быть в базе данных.Что не так с ним или с Eclipselink или со мной?

Ошибка, которую выдает eclipselink

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2-AUTHUSER' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO AUTHUSER_AUTHPRINCIPAL (principals_PRINCIPAL, users_UID) VALUES (?, ?)
        bind => [2 parameters bound]
Query: DataModifyQuery(name="principals" sql="INSERT INTO AUTHUSER_AUTHPRINCIPAL (principals_PRINCIPAL, users_UID) VALUES (?, ?)")

1 Ответ

2 голосов
/ 03 июля 2011

Это была моя вина. Я был недостаточно осторожен:)

1) Проблема возникла из-за моей ошибки, хотя я не знаю, почему в журнале ошибок говорилось об идентификаторе пользователя 2, когда у меня был только один пользователь, но я собираюсь указать возможную причину

Проблема была: Я хотел сохранить уже сохраненного пользователя. В моем @SessionScoped @ManagedBean я создал AuthUser в конструкторе. При первой регистрации она сохранилась, но я не создал новую. Когда я захотел зарегистрировать следующее, то, что на самом деле сделала моя программа: изменило имя пользователя, адрес электронной почты и пароль уже сохраненного AuthUser и захотело сохранить его снова.

Назад к 1) Я могу себе представить, что когда я вызвал persist во второй раз, Eclipselink фактически сохранил мою сущность, обновив идентификатор пользователя до 2 как в таблице AuthUser, так и в таблице соединений. Впоследствии, поскольку я определил операцию слияния в AuthUser.principals, он захотел снова обновить таблицу соединений, и именно тогда она все испортила. Если бы я внимательно посмотрел на сгенерированные запросы в файле журнала, думаю, я мог бы сам это выяснить.

Я получил подсказку: http://www.eclipse.org/forums/index.php/m/692056/#msg_692056

...