gpt4 book ai didi

java - hibernate 和 not null 的一对一映射

转载 作者:行者123 更新时间:2023-11-29 12:26:28 25 4
gpt4 key购买 nike

我对 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 工具生成了域代码类。 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;
}

这工作正常,但是如果我需要使用 hibernate 工具重新生成域代码(User.java),那么该更改将会丢失。所以我的问题是:有没有办法(甚至通过修改 mySQL 表/关系)来自动设置 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 表中获得一行,否则您将收到一个异常,提示在实体中找到 transient 实体你正在努力坚持。

话虽如此,检查某些内容是否为 null 真的那么困难吗,尤其是根据业务规则允许它为 null 的情况下?

关于java - hibernate 和 not null 的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com