在Spring Boot JPA中处理oneToMany关系

时间:2020-06-19 13:37:41

标签: spring spring-boot hibernate jpa

在我的数据库中,我有一个可以拥有多个电子邮件地址的用户。一个电子邮件地址只能有一个用户。我在数据库中有下面两个表来处理这个问题。

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;
    }

我在用户实体中设置了电子邮件地址列表,并执行上述方法来创建新用户。 我遇到的问题是在添加具有现有用户已经使用过的电子邮件地址的用户时。在这种情况下,电子邮件地址的数据库条目将使用新用户的ID更新。相反,我想给出一个错误,指出该电子邮件地址已被使用。处理此问题的最佳方法是什么?

0 个答案:

没有答案
相关问题