В моей базе данных есть пользователь, который может иметь несколько адресов электронной почты. Адрес электронной почты может иметь только один пользователь. У меня есть две таблицы в моей базе данных, чтобы справиться с этим.
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;
}
Я установил список адресов электронной почты в объекте пользователя и выполните вышеуказанный метод, чтобы создать нового пользователя. Проблема, с которой я сталкиваюсь, заключается в добавлении пользователя с адресом электронной почты, уже используемым существующим пользователем. В этом случае запись в базе данных для адреса электронной почты обновляется идентификатором нового пользователя. Вместо этого я хочу сообщить об ошибке, что адрес электронной почты уже используется. Как лучше всего с этим справиться?