Я хочу создать пользовательскую аутентификацию 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 (?, ?)")