【发布时间】:2015-01-30 15:40:25
【问题描述】:
我是 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 中,我使用休眠工具生成了域代码类。 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 表中不存在相应行的数据库读取,那将返回null。这是正确的,但是它迫使我在访问其成员之前检查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 表/关系)来自动设置 userPreferences?
【问题讨论】: