【问题标题】:Hibernate Error( "object references an unsaved transient instance" or "Duplicate entry"休眠错误(“对象引用了未保存的瞬态实例”或“重复条目”
【发布时间】:2017-05-30 00:43:49
【问题描述】:

我的代码有一个大问题:

这是我的 UserAccount 类: https://github.com/Bodyash/pizzaria/blob/master/src/main/java/com/bodyash/pizzaria/bean/UserAccount.java

这是我的 UserAccountRole 类: https://github.com/Bodyash/pizzaria/blob/master/src/main/java/com/bodyash/pizzaria/bean/UserAccountRole.java

我使用@ManyToMany 关系,因为用户可以有多个角色,例如:

用户名:testuser

角色:管理员、DBA

但是当我创建一个新的 UserAccount.class 并尝试使用角色 User 持久化这个实体时 - 我有错误:

Hibernate: 
insert 
into
    account
    (PASSWORD, SSO_ID) 
values
    (?, ?)


Hibernate: 
insert 
into
    account_role
    (TYPE) 
values
    (?)

ERROR: Duplicate entry 'USER' for key 'UK_p90gi6g6phk4nka444jkxi9ik'

这都是因为我的表 (account_role) 填充了以下类型: USER, DBA, ADMIN 我不需要再次将这个角色写入 TABLE,但 Hibernate ORM 尝试这样做。我只需要将一个新用户写入表并使用表 account_account_role 即可知道哪些角色拥有该用户。 对不起我的英语,我只是需要一点帮助。

更新:

异常的完整堆栈跟踪: pastebin.c o m / k061xxyV(抱歉,我不能发布超过 2 个链接)

【问题讨论】:

  • 什么是错误或分享完整的堆栈跟踪可能会有所帮助。假设您通过应用程序插入值。
  • 这里是完整的堆栈跟踪:pastebin.com/k061xxyV

标签: java spring hibernate spring-mvc


【解决方案1】:

每个多对多关联都有两个方面,拥有方和非拥有方,或反向。连接表在拥有方指定。

将您的 @JoinTable 移至 UserAccountRole。在UserAccountRole 实体中,尝试使用@Enumerated(STRING),以便将您设置的字段作为枚举类型持久化。例如:

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "account_account_role", 
       joinColumns = { @javax.persistence.JoinColumn(name = "account_ID") }, 
       inverseJoinColumns = { @javax.persistence.JoinColumn(name = "account_role_ID") })
    @Enumerated(STRING)
    private UserAccountRoleType type;

在反面UserAccount 你应该添加以下内容:

@ManyToMany(mappedBy="type")
private Set<UserAccountRole> userRoles;

【讨论】:

  • org.hibernate.AnnotationException: 属性 [com.bodyash.pizzaria.bean.UserAccountRole.type] 被注释为枚举,但其 java 类型不是枚举 [java.lang.String]跨度>
【解决方案2】:

发现错误。 在 AccountController 中:

错误的方式:

        HashSet<UserAccountRole> userRoles = new HashSet<>();
        UserAccountRole uar = new UserAccountRole("USER");
        userRoles.add(uar);
        user.setUserProfiles(userRoles);

已修复:

        HashSet<UserAccountRole> userRoles = new HashSet<>();
        UserAccountRole uar = userAccountRoleService.findByType("USER");
        userRoles.add(uar);
        user.setUserProfiles(userRoles);

必须从数据库中检索 AccountRole。

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2020-03-08
    • 2013-06-21
    • 1970-01-01
    • 2012-05-03
    • 2021-06-26
    相关资源
    最近更新 更多