Hibernate返回com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:重复条目

时间:2015-07-19 08:07:26

标签: java hibernate hibernate-mapping

我正在尝试插入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;

    .....
}

6 个答案:

答案 0 :(得分:3)

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

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

由于您已将此标记为unique,因此您第二次尝试将email添加为空字符串,但您有一个约束,表示您无法添加相同的值。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您可能正在尝试添加数据库中已存在的条目(或者,至少它具有相同的ID)。您应该使用Integer作为下一个数据库的主键。这样您就可以自动生成主键,从而避免遇到这些问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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