gpt4 book ai didi

java - hibernate "object references an unsaved transient instance"

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:23 34 4
gpt4 key购买 nike

我的用户位于处于ManyToOne关系的组织中,当使用现有组织创建用户时,我尝试将其分配给该用户而不创建新组织。

在我的服务中,以下是我创建用户的方法:

@Override
public UserInfo createUser(UserInfo newUser) {
// Check if organisation exists
OrganisationEntity orga = organisationDao.findByName(newUser.getOrganisation());

if (orga != null) {
// Organisation exists, we save it with the correct ID
return mapper.map(userDao.save(mapper.map(newUser, orga.getId())));
} else {
// Organisation does NOT exists, we save it and create a new one
return mapper.map(userDao.save(mapper.map(newUser, (long) -1)));
}
}

我的Mapper(帮助我将模型转换为实体)是:

 public UserEntity map(UserInfo userInfo, Long orgaId) {
UserEntity user = new UserEntity();
user.setEmail(userInfo.getEmail());
user.setFirstName(userInfo.getFirstName());
user.setLastName(userInfo.getLastName());
user.setPassword(userInfo.getPassword());

OrganisationEntity orga = new OrganisationEntity();
orga.setName(userInfo.getOrganisation());

// We set the organisation's ID
if (orgaId != -1)
orga.setId(orgaId);
user.setOrganisation(orga);
return user;
}

这是我的UserDao:

@Transactional
public interface UserDao extends CrudRepository<UserEntity, Long> {
UserEntity save(UserEntity user);
}

最后是我的UserEntity中的关系:

@ManyToOne(targetEntity = OrganisationEntity.class, cascade = CascadeType.ALL)
@JoinColumn(name = "orga_id")
private OrganisationEntity organisation;

使用新的组织工作创建用户,但当我输入现有组织时,我得到以下信息:

detached entity passed to persist

来 self 的understanding这是一个双向一致性问题,但到目前为止答案对我没有帮助。

最后这是我的实体类:

@Entity
@Table(name = "\"user\"")
public class UserEntity {

@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@NotNull
private String email;

@NotNull
private String firstName;

@NotNull
private String lastName;

@NotNull
private String password;

@ManyToOne(targetEntity = OrganisationEntity.class, cascade = CascadeType.ALL)
@JoinColumn(name = "orga_id")
private OrganisationEntity organisation;

// Getters & Setters
}

@Entity
@Table(name = "organisation")
public class OrganisationEntity {
@Id
@Column(name = "orga_id", unique = true)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@NotNull
@Column(unique = true)
private String name;

// Getters & Setters
}

最佳答案

我的问题已经解决

正如您在上面的映射器中看到的,无论如何,我都会创建一个 OrganisatonEntity 的新实例,即使它已经存在!

所以我的代码中的一个小改动解决了这个问题:

public UserEntity map(UserInfo userInfo, OrganisationEntity organisationEntity);

而不是

public UserEntity map(UserInfo userInfo, Long orgaId);

当组织已经存在时,我会将其分配给我的 UserEntity,如下所示:

user.setOrganisation(organisationEntity);

而不是实例化一个新对象。

问题解决了!

关于java - hibernate "object references an unsaved transient instance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43654352/

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