gpt4 book ai didi

java - NonUniqueObjectException 和 IdentifierGenerationException - 无法更新表

转载 作者:行者123 更新时间:2023-12-02 05:31:30 26 4
gpt4 key购买 nike

我使用 MySQL、Hibernate、JPA 和 Spring,我的问题是我无法一对一关联更新子表;我正在使用外国策略。

当我使用 saveOrUpdate 并调用第一次方法时,我可以将实体保存到数据库,但是当我再次调用它(更新)时,我得到 NonUniqueObjectException。所以我将 saveorupdate 更改为 marge 但随后出现异常 IdentifierGenerationException。我尝试了很多解决方案,但没有一个解决我的问题。

我的实体用户

@Entity
@Table(name = "user", uniqueConstraints = {
@UniqueConstraint(columnNames = {"login"})
})
@DynamicInsert
@DynamicUpdate
public class User implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private int user_id;

@OneToOne(mappedBy = "users")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private UserInformation userInformation;

fields,getters,setters...

我的实体用户信息

@Entity
@Table(name = "user_information")
public class UserInformation implements Serializable{

@Id
@GeneratedValue(generator = "generator")
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = {@Parameter(name = "property", value = "users")})
@Column(name = "user_information_id", unique = true)
private int user_information_id;

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
private User users;
fields,getters,setters....

抛出异常时的方法

@Override
public void updateOrSaveUserInformation(int user_id,
UserInformation userInformation) throws ObjectNotFoundException {
Session session = this.sessionFactory.getCurrentSession();
User user = (User) session.get(User.class, user_id);
user.setUserInformation(userInformation);
userInformation.setUser(user);
session.merge(user);
}

我从我的 Controller 调用 updateOrSaveUserInformation,其中我使用 ModelAttribute UserInformation 提交表单,并将 UserInformation 从表单传递到此方法,我将用户信息保留在 SessionAttribute 中。

当我调用这个方法时,我得到异常

org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one  
property [adrian.example.musicplayer.model.User.UserInformation.users]

我不知道我在 UserInformation 中设置用户的问题出在哪里

userInformation.setUser(user);

当我使用 saveOrUpdate 时,我遇到异常

org.springframework.dao.DuplicateKeyException: A different object with the same identifier 
value was already associated with the session :
[adrian.example.musicplayer.model.User.UserInformation#26]; nested exception is
org.hibernate.NonUniqueObjectException: A different object with the same identifier value
was
already associated with the session :
[adrian.example.musicplayer.model.User.UserInformation#26]

数字 26 是来自用户的 ID。

我还注意到,当我第二次调用 updateOrSaveUserInformation 时,我从表 UserInformation 获取数据

  user.getUserInformation() //its not null

最佳答案

问题说明:

1) 当您使用以下方式获取用户详细信息时:

User user = (User) session.get(User.class, user_id);

然后 Hibernate 也会加载您的 UserInformation 对象。因此,在内存中,Hibernate 注意到内存中存在 id 为 26 的 UserInformation 类型的对象。

2)现在,当您只有这行代码时:

user.setUserInformation(userInformation);

然后调用session.saveOrUpdate(user),然后 Hibernate 抛出异常:

 org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [.org.package...UserInformation.users]

这是因为根据您的映射,UserInformationIdUserforeign 键策略进行映射。因此,它尝试获取 users (其类型为 User)属性并尝试查找其 Id,因为此 Idnull,Hibernate 无法将 Id 分配给您的 UserInformation 对象。这就是它说的原因:尝试从 null 属性用户分配 id

3) 现在要修复步骤 2 中的错误,如果您尝试再添加一行代码:

userInformation.setUsers(user);

然后调用session.saveOrUpdate(user),然后hibernate再次抛出异常:

 org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [org.package....UserInformation#26]

这是因为,您正在向自定义方法传递一个新的 UserInformation 对象,因此该对象没有任何 Id。因此,当您调用 saveOrUpdate 时,hibernate 会尝试从 users 属性中选择 Id (即 26),然后尝试将其分配给您的新 UserInformation 对象。

最后,现在您有两个 UserInformation 对象,其 Id26 相同(按照步骤 1 和步骤 3)。因此, hibernate 会抛出 NonUniqueObjectException:具有相同标识符值的不同对象已与 session 关联

解决方案:

要解决这些问题,您可以执行以下操作:

User user = (User) session.get(User.class, user_id);
UserInformation info = user.getUserInformation();
info.setPropertyName(userInformation.getPropertyName());
session.saveOrUpdate(user);

只需获取 User 中可用的 UserInformation 对象,然后设置所有必需的属性,然后保存 User 对象。

关于java - NonUniqueObjectException 和 IdentifierGenerationException - 无法更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490027/

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