gpt4 book ai didi

java - 为什么当我使用 JPA 一对一双向映射时,我无法直接从一个持久化实体

转载 作者:行者123 更新时间:2023-12-01 10:10:01 25 4
gpt4 key购买 nike

我使用 postgres 数据库。我创建了两个表是 user 和 user_information,user 有指向 user_information 的链接:

CREATE TABLE USERS(
id NUMERIC PRIMARY KEY DEFAULT NEXTVAL('users_id'),
password TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
phone TEXT NOT NULL UNIQUE
);
CREATE TABLE USERS_INFORMATION(
id NUMERIC PRIMARY KEY DEFAULT NEXTVAL('users_information_id'),
user_id NUMERIC UNIQUE REFERENCES USERS(ID) NOT NULL,
firs_name TEXT DEFAULT NULL,
last_name TEXT DEFAULT NULL,
SEX TEXT DEFAULT NULL,
BIRTHDAY DATE DEFAULT NULL
);

然后我创建 jpa 实体:用户:

@Entity

...

public class User implements Serializable {
...

public User() {
}

...

@OneToOne(mappedBy="user", fetch=FetchType.LAZY)
public UsersInformation getUsersInformation() {
return this.usersInformation;
}
}

和用户信息:

@Entity
...
public class UsersInformation implements Serializable {
...
@OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="user_id")
public User getUser() {
return this.user;
}

...

}

为什么我可以创建对象 user_information 在其中设置对象用户端使用 persist(user_informtion) 并且它可以工作,但是当我创建用户并在 user 中设置 user_information 并使用 persist(user) 时它是事务异常?我该如何解决它。我使用JPA eclipselink、ejb(如facade)和glassfish。

最佳答案

要级联持久,您需要通过调用 userInfo.setUserInformation(user)user.setUser(userInfo) 来确保两个对象相互引用在坚持之前分别对他们每个人进行。 JPA 不会自动填充该空白,因为您的数据模型(虽然在几乎所有情况下都是这样)不一定是线性的。事实上,如果最适合您的客户要求,这些引用可能会跨越多个对象。

关于java - 为什么当我使用 JPA 一对一双向映射时,我无法直接从一个持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36180795/

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