Hibernate“对象引用未保存的瞬态实例”

时间:2017-04-27 09:51:09

标签: java hibernate

我的User位于Organisation的{​​{1}}关系中,当用现有的组织创建用户时,我试图将其分配给它而不创建新的组织。

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

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

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

  

传递给persist的分离实体

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

最后这是我的实体类:

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

@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
}

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题,

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

因此,我的代码中的一个小变化解决了它:

public UserEntity map(UserInfo userInfo, OrganisationEntity organisationEntity);

而不是

public UserEntity map(UserInfo userInfo, Long orgaId);

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

user.setOrganisation(organisationEntity);

而不是实例化新对象。

问题解决了!