gpt4 book ai didi

java - 在 Hibernate 中保留一对一关系实体 - 实体已分离

转载 作者:行者123 更新时间:2023-11-30 03:38:41 25 4
gpt4 key购买 nike

我有两个处于一对一关系的表:

用户:

create table users (

id int not null primary key,
username varchar2(40) not null unique,
password varchar2(60) not null,
firstName varchar2(40) not null,
lastName varchar2(40) not null,
personalId varchar2(11) unique,
city varchar2(40),
address varchar2(40),
email varchar2(40) not null unique,
phone varchar2(9) unique
);

用户帐户

    create table usersAccounts (
id int primary key,
accountNr varchar2(26) not null unique,
balance float not null,
createDate date not null,
expiredDate date,
lastCharge date,
userId int constraint userAccount_fk_user references users(id),
);

我的实体:

用户

    @Entity
@Table(name = "users")
public class User implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "id")
private Integer id;
@NotBlank
@NotNull
@Size(min = 3, max = 40)
@Column(name = "username")
private String username;
@NotBlank
@NotNull
@Size(min = 3, max = 60)
@Column(name = "password")
private String password;
@NotBlank
@NotNull
@Size(min = 3, max = 40)
@Column(name = "firstName")
private String firstName;
@NotBlank
@NotNull
@Size(min = 3, max = 40)
@Column(name = "lastName")
private String lastName;
@Size(min = 11, max = 11)
@Column(name = "personalId")
private String personalId;
@Size(max = 40)
@Column(name = "city")
private String city;
@Size(max = 40)
@Column(name = "address")
private String address;
@NotBlank
@NotNull
@Email
@Size(max = 40)
@Column(name = "email")
private String email;
@Size(min = 9, max = 9)
@Column(name = "phone")
private String phone;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<UserRole> userRoleSet;
@OneToOne(mappedBy = "user")
private UserAccount userAccount;

用户帐户

    @Entity
@Table(name = "usersAccounts")
public class UserAccount implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "id")
private Integer id;
@NotNull
@Column(name = "accountNr")
private String accountNr;
@NotNull
@Column(name = "balance")
private float balance;
@NotNull
@Column(name = "createDate")
private Date createDate;
@Column(name = "expiredDate")
private Date expiredDate;
@Column(name = "lastCharge")
private Date lastCharge;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "userId")
private User user;

我尝试坚持这个,但我有错误:

    @RequestMapping(value = "/admin/addAdmin", method = RequestMethod.POST)
public String addAdmin(@ModelAttribute("user") UserDto userDto,
BindingResult result) {
AddUserValidator addUserValidator = new AddUserValidator();
addUserValidator.validate(userDto, result);
if (result.hasErrors()) {
return "admin/addadmin";
} else {
ErrorMessage errorMessage;
User user = prepareModelUser(userDto);
if ((errorMessage = userService.createUser(user)) != null) {
result.rejectValue(errorMessage.getPath(),
errorMessage.getDescription());
return "admin/addadmin";
} else {
user = userService.findByUsername(user.getUsername());
UserRole userRole = new UserRole("ROLE_ADMIN");
userRole.setUser(user);
userRoleService.createUserRole(userRole);
UserAccount ua = new UserAccount();
ua.setAccountNr("12345678901");
ua.setBalance(100);
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = new Date();
String dateStr = dateFormat.format(date);
try {
ua.setCreateDate(dateFormat.parse(dateStr));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
user = userService.findUser(user.getId());
ua.setUser(user);
userAccountService.createUserAccount(ua);
return "redirect:/admin/adminlist";
}
}
}

当我尝试坚持时,我收到此错误:

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/ibank] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: pl.piotr.ibank.model.User] with root cause org.hibernate.PersistentObjectException: detached entity passed to persist: pl.piotr.ibank.model.User

userRole.setUser(user);
userRoleService.createUserRole(userRole);
保存得很好,但是当我尝试 ua.setUser(user); 时
userAccountService.createUserAccount(ua);
我得到分离的实体

最佳答案

让主键同时成为外键是非常糟糕的做法。特别是当您有 @GenerateValue 时。

仔细观察,您的实体映射正常,但 usersAccounts 表需要调整。从 id 列中删除该外键约束,并添加新列 userId ,该列将成为 users#id 的外键。之后一切都应该正常。

关于java - 在 Hibernate 中保留一对一关系实体 - 实体已分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252984/

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