Обработка отношения oneToMany в Spring boot JPA - PullRequest
0 голосов
/ 19 июня 2020

В моей базе данных есть пользователь, который может иметь несколько адресов электронной почты. Адрес электронной почты может иметь только один пользователь. У меня есть две таблицы в моей базе данных, чтобы справиться с этим.

CREATE TABLE IF NOT EXISTS w4a_user (
    id INTEGER NOT NULL AUTO_INCREMENT,
    login_id VARCHAR(100) NOT NULL UNIQUE,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    division INTEGER NOT NULL,
    created_date TIMESTAMP NOT NULL,
    last_active DATE,
    PRIMARY KEY (id), 
    FOREIGN KEY (login_id) REFERENCES w4a_authentication_data (login_id) ON DELETE RESTRICT,
    FOREIGN KEY (division) REFERENCES w4a_division (id) ON DELETE RESTRICT
);

CREATE TABLE IF NOT EXISTS w4a_email_address(
    email_address VARCHAR(100) NOT NULL,
    user_id INTEGER NOT NULL,
    is_confirmed BOOLEAN NOT NULL DEFAULT FALSE,
    PRIMARY KEY (email_address),
    FOREIGN KEY (user_id) REFERENCES w4a_user (id) ON DELETE CASCADE 
);

В моем загрузочном приложении Spring у меня есть следующие классы сущностей, чтобы справиться с этим.

User. java

@Entity
@Table(name = "w4a_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;

    @Column(name = "first_name")
    @Size(max = 100, message = GlobalConstants.ErrorMessageConstants.ERROR_FIRST_NAME_LENGTH_EXCEEDED)
    private String firstName;

    @Column(name = "last_name")
    @Size(max = 100, message = GlobalConstants.ErrorMessageConstants.ERROR_LAST_NAME_LENGTH_EXCEEDED)
    private String lastName;

    @Column(name = "created_date")
    private Date createdDate;

    @Column(name = "last_active")
    private Date lastActive;

    @ManyToOne
    @JoinColumn(name = "division", referencedColumnName = "id")
    private Division division;

    @OneToMany(mappedBy = "userId", cascade = CascadeType.ALL, orphanRemoval = true)
    @Size(min = 1)
    private List<ContactNumber> contactNumberList;

    @OneToMany(mappedBy = "userId", cascade = CascadeType.ALL, orphanRemoval = true)
    @Size(min = 1)
    private List<EmailAddress> emailAddresses;
.
.
}

EmailAddress. java

@Entity
@Table(name = "w4a_email_address")
public class EmailAddress {
    @Id
    @Column(name = "email_address")
    @Email(message = GlobalConstants.ErrorMessageConstants.ERROR_EMAIL_INCORRECT_FORMAT,
            regexp = GlobalConstants.RegexList.EMAIL_REGEX)
    @Size(max = 100, message = GlobalConstants.ErrorMessageConstants.ERROR_EMAIL_LENGTH_EXCEEDED)
    private String emailAddress;

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User userId;

    @Column(name = "is_confirmed")
    private Boolean isConfirmed;
.
.
}

Я использую следующий метод для сохранения прав на мою базу данных.

@PersistenceContext
    private EntityManager em;

@Override
    public T createEntity(T entity) {
        this.em.unwrap(Session.class).save(entity);
        return entity;
    }

Я установил список адресов электронной почты в объекте пользователя и выполните вышеуказанный метод, чтобы создать нового пользователя. Проблема, с которой я сталкиваюсь, заключается в добавлении пользователя с адресом электронной почты, уже используемым существующим пользователем. В этом случае запись в базе данных для адреса электронной почты обновляется идентификатором нового пользователя. Вместо этого я хочу сообщить об ошибке, что адрес электронной почты уже используется. Как лучше всего с этим справиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...