一对一映射 hibernate and not null

One-to-one mapping hibernate and not null

我是休眠的新手,也是 MySQL 的新手。 我有以下两个 tables:

CREATE TABLE storeman.user (
    id INT NOT NULL AUTO_INCREMENT,
    email VARCHAR(80) NOT NULL,
    display_name VARCHAR(50),
    password CHAR(41),
    active BOOLEAN NOT NULL DEFAULT FALSE,
    provisional BOOLEAN NOT NULL DEFAULT FALSE,
    last_login TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE INDEX (email)
);

CREATE TABLE storeman.user_preferences (
    id INT NOT NULL AUTO_INCREMENT,
    notify_login BOOLEAN NOT NULL DEFAULT FALSE,
    PRIMARY KEY (id),
    CONSTRAINT id_foreign FOREIGN KEY (id) REFERENCES user (id) ON DELETE CASCADE
);

在 Eclipse 中,我使用休眠工具生成了域代码 类。 User.java 看起来像这样(简化):

@Entity
@Table(name = "user", catalog = "storeman", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User implements java.io.Serializable {

    private Integer id;
    [...]
    private UserPreferences userPreferences;

    public User() {
    }


    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    [...]

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
    public UserPreferences getUserPreferences() {
        return this.userPreferences;
    }
}

我的问题是 getUserPreferences:当然,如果创建新用户或从 user_detail table不存在。这是正确的,但是它迫使我在访问其成员之前检查 userPreferences 是否不为空。从编码的角度来看,它并不是那么方便。所以我像这样更改了 User.getUserPreferences 方法,以获得默认值:

@OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
public UserPreferences getUserPreferences() {
    if (this.userPreferences==null)
        this.userPreferences = new UserPreferences();
    return this.userPreferences;
}

这工作正常,但是如果我需要使用休眠工具重新生成域代码 (User.java),该更改将会丢失。所以我的问题是:有没有办法(甚至通过修改 mySQL table/relationships)自动始终设置 userPreferences?

没有办法在你的代码之外(至少我想不到)通过一些配置或类似的东西来做到这一点。

您可以做的一件事是在声明关系时对其进行初始化

private UserPreferences userPreferences = new UserPreferences()

但这也无法在代码重新生成后继续存在。我能想到的唯一其他方法是将此初始化代码放入某个 util 方法中,这样无论实体代码是否重新生成,您都可以在那里维护它。

UserUtils.getUserPreferences(User user)

但是,这仅适用于您编写的代码,如果某些框架需要它,您将再次获得空值,因为它不会使用您的 util 方法(在这种情况下第一种方法更好)。

请记住,当您在托管实体上初始化此对象时,新对象将持久保存到数据库中。

User user = userDAO.getUser(id);
user.getUserPreferences(); // this code initializes the relation (new UserPreference())

在这些行之后,如果 cascade 是以这种方式配置的,您将在 user_preferences table 中得到一行,否则您将得到一个异常,抱怨在实体中找到瞬态实体你在努力坚持

综上所述,检查某项是否为 null 真的有那么难吗,尤其是如果业务规则允许它为 null?