【问题标题】:Hibernate returns com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entryHibernate 返回 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry
【发布时间】:2015-10-08 13:17:06
【问题描述】:

我正在尝试插入Member 类如下,但它返回以下异常。

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
Duplicate entry '' for key 'UK_7pn834d04yft1rkvpqf0viuyc'

代码

Member member = new Member(email, encodedPassword,
                    "USER", false, firstName,
                    lastName);

....
session.save(member);

实体

@Entity
public class Member {
    @Id
    @Column(name = "username", nullable = false, unique = true)
    private String email;
    @Column(nullable = false)
    private String password;
    @Column(nullable=false)
    private String authority;
    @Column(nullable = false)
    private boolean enabled;
    @Column(nullable = false)
    String fname;
    @Column(nullable = false)
    String lname;
    @OneToMany
    List<Product> products = new ArrayList<Product>();
    @OneToMany(mappedBy = "requester")
    private Set<Friendship> friendRequests = new HashSet<Friendship>();
    @OneToMany(mappedBy = "friend")
    private Set<Friendship> friends= new HashSet<Friendship>();
    .....
}



 @Entity
public class Friendship implements Serializable {

    private static final long serialVersionUID = -12799066578787745989L;
    @Id
    @ManyToOne
    @JoinColumn(referencedColumnName = "username")
    Member requester;
    @Id
    @ManyToOne
    @JoinColumn(referencedColumnName = "username")
    Member friend;
    @Temporal(javax.persistence.TemporalType.DATE)
    Date date;
    @Column(nullable = false)
    boolean active;

    .....
}

【问题讨论】:

  • 我有点惊讶这甚至运行。您的 Friendship 实体似乎有两个 @Id 列,这两个列都映射到您的连接列。这个实体需要它自己的主键。
  • @SteveC 那你有什么建议?
  • 您是否在会员实体中使用“用户名”作为 ID?这是您的实体定义和分配注释的问题。
  • 什么是 UK_7pn834d04yft1rkvpqf0viuyc?关于这两个@Id,尝试删除一个,看看它的行为如何

标签: java hibernate hibernate-mapping


【解决方案1】:

我不是 100% 确定,但我怀疑在 id 的位置上使用 DEFAULT 而不是使用自动增量,请参阅link

【讨论】:

    【解决方案2】:

    检查为hibernate添加的约束是否与您正在使用的db不匹配。

    【讨论】:

      【解决方案3】:

      您可能正在尝试添加一个已经存在于数据库中的条目(或者,至少它具有相同的 id)。您应该使用整数作为下一个数据库的主键。这样你就可以自动生成主键,这样你就不会遇到这类问题了。

      【讨论】:

        【解决方案4】:

        也许你可以尝试用“deleted = false, insertable=false”来注释“requester”和“friend”。

        【讨论】:

          【解决方案5】:

          看起来密钥是由 Hibernate 生成的,例如hbm2ddl.auto=create

          如果这是开发/测试环境,您可以在模型中添加@ForeignKey 注释,并在重新生成表后查看违反了哪个键(与哪个属性相关)。为了便于调试,值得多写几行。

          在生产环境中,您可以从 mysql INFORMATION_SCHEMA 表中跟踪密钥。

          【讨论】:

            【解决方案6】:

            检查您是否将空字符串添加到映射到Member 的表中。 由于Duplicate entry '' for key 'UK_7pn834d04yft1rkvpqf0viuyc' = 您正在尝试第二次添加相同的值。

            看看这个:
            @Column(name = "username", nullable = false, unique = true) private String email;

            由于您已将其标记为 unique,因此您可能正在尝试第二次将 email 添加为空字符串,但您对其有一个限制,即不能添加相同的值。

            【讨论】:

            • 我检查了它们不为空的值,我认为问题出在其中一个集合上,尽管这些表中没有任何值。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-09-09
            • 1970-01-01
            • 2013-12-02
            • 2015-12-22
            • 2014-05-20
            • 1970-01-01
            • 2017-09-05
            相关资源
            最近更新 更多