我有一个关系一个两代表一:坚持以一对一的关系实体在休眠 - 实体分离
用户:
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
);
UsersAccounts
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;
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);
我得到分离实体
我编辑了我的第一篇文章。我利用了你的建议,并在数据库中编辑了我的表格。但是,当我尝试坚持我得到新的错误。实体用户被分离。为什么? @Predrag Maric – 2014-12-02 16:41:43
很难说,不看服务代码。尝试简化您的代码,并坚持一个UserAccount相关的用户。当你成功时,添加其他代码部分并查看哪个部分导致了问题。你应该为此编写一个单元测试,这对外部的人来说很难在这个代码中导航。 – 2014-12-02 16:54:06