Java 一对一映射休眠且不为null

Java 一对一映射休眠且不为null,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我不熟悉hibernate,也不熟悉MySQL。 我有以下两个表格: 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 BOOLEA

我不熟悉hibernate,也不熟悉MySQL。 我有以下两个表格:

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中,我使用hibernate工具生成了域代码类。java如下所示(siplified):

我的问题是
getUserPreferences
:当然,如果创建新用户或从数据库读取
user\u detail
表中不存在相应行的数据,则返回
null
。这是正确的,但是它迫使我在访问其成员之前检查
userPreferences
是否不为null。从编码的角度来看,它并不那么方便。因此我更改了
User.getUserPreferences
方法,如下所示,以获取默认值:

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

这很好,但是如果我需要使用hibernate工具重新生成域代码(User.java),那么更改就会丢失。所以我的问题是:有没有一种方法(甚至通过修改mySQL表/关系)可以自动设置用户首选项?

在代码之外(至少我想不出来),通过一些配置或类似的方式无法做到这一点

您可以做的一件事是在声明关系时初始化它

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\u preferences
表中得到一行,或者您将得到一个异常,抱怨在您试图持久化的实体中找到了瞬态实体


尽管如此,检查某个东西是否为空真的有那么难吗,特别是如果根据业务规则允许它为空的话?

这并不难,但我很懒!:)严肃地说:真正的问题不是检查某个东西是否为空,我只是想看看我是否可以学习MySQL和/或Hibernate的一些“隐藏”功能。我想写“懒惰”,但我们彼此不认识,我不想粗鲁:)我编辑了我的答案,并记住了更多的东西,但是,在这件事上没有一个懒惰友好的方法。
User user = userDAO.getUser(id);
user.getUserPreferences(); // this code initializes the relation (new UserPreference())