Spring Boot: MySQL Duplicate Key ошибка при попытке сопоставить клиентов с элементами - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать небольшое CRUD-приложение Spring Boot с некоторыми базовыми функциями электронной коммерции (например, добавить в корзину и т. Д.).Мои основные сущности - это клиенты, сыр и роли.

При попытке сопоставить клиентов с сырами, он прекрасно работает только с одним пользователем.Таблица "customer-cheeses" создается с помощью accountNumber (id) клиента вместе с идентификатором Cheese.Вот изображение таблицы:

MySQL table

Однако при попытке добавить элементы с другой учетной записью я получаю сообщение об ошибке, подобное этому:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: дублирующаяся запись '6' для ключа 'UK_pg95jxw3noahgyna6qwbl3ivd'

Я предполагаю, что это только один сыр, я могу сказать, что это только один сыр, я могуЯ бы.Я пытался поиграть с различными аннотациями в спящем режиме (например, @ElementCollection, @manytomany и т. Д.), Но не смог заставить это работать.

Любой вклад будет оценен.Кроме того, пожалуйста, дайте мне знать, если вам нужны какие-либо из моих служб или контроллеров, но фактическое добавление и удаление отлично работает в моем приложении.

Клиент

package com.example.demo.models;

import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Customer implements Serializable {

    @NotNull
    @Size(min = 2, max = 25)
    private String name;

    @GeneratedValue
    @Id
    private int accountNumber;

    private BigDecimal accountFunds;

    @NotNull
    @Size(min = 2)
    private String password;

    @NotNull
    @Size(min = 2, max = 25)
    @Email
    private String email;

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="user_roles",
            joinColumns={@JoinColumn(name="CUSTOMER_EMAIL", referencedColumnName = "email")},
            inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="id")})
    private List<Role> roles;

    @ElementCollection
    private List<Cheese> cheeses = new ArrayList<>();


    public Customer(String name, String password, String email) {
        this.name = name;
        this.password = password;
        this.email = email;
        this.accountFunds = new BigDecimal(225.00); // default value
    }

    public Customer() {}

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAccountNumber() {
        return accountNumber;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public BigDecimal getAccountFunds() {
        return accountFunds;
    }

    public void setAccountFunds(BigDecimal accountFunds) {
        this.accountFunds = accountFunds;
    }

    public List<Cheese> getCheeses() {
        return cheeses;
    }

    public void setCheeses(List<Cheese> cheeses) {
        this.cheeses = cheeses;
    }
}

Сыр

package com.example.demo.models;

import javax.persistence.*;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Cheese {

    @NotNull
    @Size(min=2, max=20)
    private String name;


    @NotNull
    @Size(min=2, max=20)
    private String description;

    @NotNull
    @DecimalMax("10000.0") @DecimalMin("0.0")
    private BigDecimal price;

    @Id
    @GeneratedValue
    private int id;

    @ManyToMany
    private List<Customer> customers = new ArrayList<>();

    public Cheese() {}

    public Cheese(String name, String description, BigDecimal price) {
        this.name = name;
        this.description = description;
        this.price = price;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

1 Ответ

0 голосов
/ 06 июня 2018

Хммм ... итак, я заработал, выполнив следующее: я изменил адрес электронной почты на customer_id, который, по общему признанию, не должен иметь никакого значения.Для класса сыра я сделал много для многих, чтобы быть "mappedBy" сырами.

Опять же, я не уверен, почему это работает, а другой нет, но, похоже, это так.

Клиент

package com.example.demo.models;

import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Customer implements Serializable {

@NotNull
@Size(min = 2, max = 25)
private String name;

@GeneratedValue
@Id
private int accountNumber;

private BigDecimal accountFunds;

@NotNull
@Size(min = 2)
private String password;

@NotNull
@Size(min = 2, max = 25)
@Email
private String email;

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="user_roles",
        joinColumns={@JoinColumn(name="CUSTOMER_EMAIL", referencedColumnName = "email")},
        inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="id")})
private List<Role> roles;

//@ElementCollection

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="cheese_customers",
        joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName = "accountNumber")},
        inverseJoinColumns={@JoinColumn(name="PRODUCT_ID", referencedColumnName="id")})
private List<Cheese> cheeses = new ArrayList<>();


public Customer(String name, String password, String email) {
    this.name = name;
    this.password = password;
    this.email = email;
    this.accountFunds = new BigDecimal(225.00);
}

public Customer() {}

public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAccountNumber() {
    return accountNumber;
}

public List<Role> getRoles() {
    return roles;
}

public void setRoles(List<Role> roles) {
    this.roles = roles;
}

public BigDecimal getAccountFunds() {
    return accountFunds;
}

public void setAccountFunds(BigDecimal accountFunds) {
    this.accountFunds = accountFunds;
}

public List<Cheese> getCheeses() {
    return cheeses;
}

public void setCheeses(List<Cheese> cheeses) {
    this.cheeses = cheeses;
}
}

Сыр

package com.example.demo.models;

import javax.persistence.*;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Cheese {

    @NotNull
    @Size(min=2, max=20)
    private String name;


    @NotNull
    @Size(min=2, max=20)
    private String description;

    @NotNull
    @DecimalMax("10000.0") @DecimalMin("0.0")
    private BigDecimal price;

    @Id
    @GeneratedValue
    private int id;


    @ManyToMany(mappedBy = "cheeses")
    private List<Customer> customers = new ArrayList<>();

    public Cheese() {}

    public Cheese(String name, String description, BigDecimal price) {
        this.name = name;
        this.description = description;
        this.price = price;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...