Java 在不知道前端和JSON的数据库id的情况下,将子实体分配给父实体

Java 在不知道前端和JSON的数据库id的情况下,将子实体分配给父实体,java,json,hibernate,dto,Java,Json,Hibernate,Dto,我正在使用spring和hibernate开发一个RESTFUL web应用程序。我想创建一个新的用户实体,该实体与角色实体有多通关系: @Entity @Table(name = "roles") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; @Column(unique = true) private RoleEn

我正在使用spring和hibernate开发一个RESTFUL web应用程序。我想创建一个新的
用户
实体,该实体与
角色
实体有
多通
关系:

@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    @Column(unique = true)
    private RoleEnum name;
}


@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    private String firstName;
    private String lastName;

    @ManyToOne
    private Role role;
}
在前端html和ajax中,我设置了除id之外的所有字段(id为
USER
和id为
ROLE
),并将json字符串发送到后端。这是示例json:

{
    "firstName": "john",
    "lastName": "becks",
    "role": {
         "name": "STUDENT"
     }
}
问题出现在这里,我想将
学生
角色分配给数据库中存在的新
用户
,但我只知道它的名称而不是id。我从hibernate得到错误:

TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
有人能帮忙解决这个问题吗


提前谢谢

您的示例中缺少许多部分,但简单地说,hibernate在其持久性上下文中没有关系中的角色实例。换句话说,它告诉您在持久化用户之前先持久化新角色。Hibernate很聪明,它跟踪从数据库中获取的对象,并且可以区分新实体和现有实体

显然,这不是你想要做的,你想要使用一个现有的角色,而不是创建一个新的角色

唯一的方法是从数据库加载角色,使用名称查找它,然后将检索到的角色添加到关系中

大概是这样的:

public User createUser(final String userFirstName, final String userLastName, final String roleName) {

    Role role = roleDao.findByName(roleName);

    if(role == null) {

        role = new Role(roleName);
        roleDao.save(role);
    }

    final User user = new User(userFirstName, userLastName);
    user.addRole(role);
    userDao.save(user);

    return user;
}

谢谢这就是我的想法。我只是想知道是否有任何内部hibernate解决方案。无论如何谢谢你