2015-07-19 3 views
4

Я пытаюсь вставить класс Member следующим образом, но он возвращает ниже исключения.Hibernate возвращает com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Дублируемая запись

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; 

    ..... 
} 
+1

Я немного удивлен, это даже работает. Кажется, что ваш объект 'Friendship' имеет два столбца' @ Id', оба из которых сопоставляются с вашими столбцами соединения. Этот объект нуждается в собственном первичном ключе. –

+0

@SteveC каково ваше предложение? –

+0

Вы используете «имя пользователя» в качестве идентификатора в своем членстве? Его проблема с вашей сущностью, определяющей и назначающей аннотации. – arch

ответ

3

Проверьте, если вы добавляете пустую строку в таблицу, которая отображается на Member. С Duplicate entry '' for key 'UK_7pn834d04yft1rkvpqf0viuyc' = вы пытаетесь добавить одно и то же значение во второй раз.

Посмотрите на это:
@Column(name = "username", nullable = false, unique = true) private String email;

Поскольку вы отметили это как unique Propably вы пытаетесь добавить email, как пустая строка второй раз, но у вас есть ограничение на нем говорят, что вы не можете добавить такое же значение.

+0

Я проверил значения, которые они не равны null. Я считаю, что проблема связана с одной из коллекций, хотя в этих таблицах нет значения. –

1

Похоже, что ключи генерируются Hibernate, например. с hbm2ddl.auto=create

Если это среда разработки/тестирования, вы можете добавить аннотации @ForeignKey к своей модели и посмотреть, какой ключ (связанный с каким свойством) нарушается после восстановления таблиц. Стоит написать несколько дополнительных строк для удобства отладки.

В производственной среде вы можете отследить ключ из таблиц mysql INFORMATION_SCHEMA.

1

Возможно, вы можете попробовать аннотировать «запросчик» и «друг» с помощью «deleted = false, insertable = false».

1

Возможно, вы пытаетесь добавить запись, которая уже существует в базе данных (или, по крайней мере, имеет тот же идентификатор). Вы должны использовать Integer как первичный ключ для следующих баз данных. Таким образом, вы можете автогенерировать первичный ключ, чтобы у вас не было таких проблем.

0

Проверьте, не связаны ли ограничения, добавленные для спящего режима, с используемым db.

0

Я не уверен на 100%, но я подозреваю, что использование DEFAULT на позиции ид вместо использования автоинкрементного см это link

Смежные вопросы