【问题标题】:JPA, duplicate entry on persist in join table when using @ManyToMany relationshipJPA,使用@ManyToMany关系时在连接表中持久存在重复条目
【发布时间】:2011-09-27 08:27:39
【问题描述】:

我想创建自定义 JAAS 身份验证,其中我的用户和主体关系在 JPA 中定义,如下所示:

类 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;
}

类 AuthPrincipal

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 是新用户的 id,因此不能已经在数据库中。它或 Eclipselink 或 Me 有什么问题?

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 (?, ?)")

【问题讨论】:

  • 是我的错,...现在发布我的问题的答案。

标签: jpa many-to-many eclipselink duplicates


【解决方案1】:

这都是我的错。我不够小心:)

1) 问题是因为我的错而发生的,但是我不知道为什么当我只有一个用户时,错误日志会提到用户 id 2,但我会告诉一个可能的原因

问题是:我想持久化一个已经持久化的用户。在我的@SessionScoped@ManagedBean 中,我在构造函数中创建了一个AuthUser。在第一次注册中它得到了坚持,但我没有创建一个新的。当我想注册下一个时,我的程序实际上做的是:更改已经持久化的 AuthUser 的用户名、电子邮件和密码,并想再次持久化它。

返回 1) 我可以想象,当我第二次调用persist 时,Eclipselink 实际上将我的实体持久化,将AuthUser 表和连接表中的用户ID 更新为2。之后因为我在AuthUser.principals 上定义了Merge 操作,它想再次更新连接表,结果就搞砸了。如果我仔细查看日志文件中生成的查询,我想我可以自己弄清楚。

我在这里得到了提示:http://www.eclipse.org/forums/index.php/m/692056/#msg_692056

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 2015-10-18
    • 1970-01-01
    • 2014-06-13
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2012-04-06
    相关资源
    最近更新 更多