一对一映射 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?
我是休眠的新手,也是 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?