【问题标题】:Assign child enity to parent entity without knowing database id from frontEnd and JSON在不知道前端和 JSON 的数据库 ID 的情况下将子实体分配给父实体
【发布时间】:2019-08-05 12:42:22
【问题描述】:

我正在开发一个带有 spring 和 hibernate 的 RESTFUL Web 应用程序。我想创建一个与ROLE 实体有ManyToOne 关系的新USER 实体:

@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 中,我设置了除 ids(USER 的 id 和 ROLE 的 id)之外的所有字段,并将 json 字符串发送到后端。这是示例 json:

{
    "firstName": "john",
    "lastName": "becks",
    "role": {
         "name": "STUDENT"
     }
}

问题来了,我想将STUDENT 角色分配给数据库中存在的这个新USER,但我只知道它的名称而不是id。我从休眠中得到错误:

TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

谁能帮忙解决这个问题?

提前致谢!

【问题讨论】:

    标签: java json hibernate dto


    【解决方案1】:

    您的示例中缺少许多部分,但简单地说,hibernate 在其持久性上下文中没有来自关系的 Role 实例。换句话说,它告诉您在持久化用户之前先持久化新角色。 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;
    }
    

    【讨论】:

    • 谢谢。这就是我的想法。我只是想知道是否有任何内部休眠解决方案。还是谢谢你
    猜你喜欢
    • 2021-04-04
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多