当我尝试插入新记录时,Hibernate使用更新

时间:2018-06-07 12:53:46

标签: spring hibernate

enter image description here

我有一个如上所述的数据库结构。然后我试图以下面的格式插入一个新的记录

{
    "userId": 2,
    "firstName": "project",
    "lastName": "principa;",
    "username": "principal1",
    "password": "$2a$04$eFytJDGtjbThXa80FyOOBuFdK2IwjyWefYkMpiBEFlpBwDH.5PM0K",
    "institution": {
        "institutionID": 3,
        "institutionName": "new_test_schoo;"
    },
    "authorities": [
        {
            "authorityID": 2,
            "authority": "principal"
        }
    ]
}

然后从控制台和表格中,我可以看到该机构已插入,但是hibernate正在尝试更新。

Hibernate: insert into users (first_name, institution_id, last_name, password, username) values (?, ?, ?, ?, ?)
Hibernate: update authorities set authority=?, user_id=? where authority_id=?

我使用以下方法插入新的记录

@Override
public void saveUser(Users theUser) {
    Session currentSession = sessionFactory.getCurrentSession();
    currentSession.save(theUser);
}

这是我的用户实体类

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private int userId;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="username")
private String username;
@Column(name="password")
private String password;

@ManyToOne(cascade={CascadeType.DETACH, CascadeType.MERGE,CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name="institution_id")
private Institution institution;

@JsonManagedReference
@OneToMany(fetch=FetchType.EAGER,
            mappedBy="user", 
            cascade={CascadeType.ALL})
private List<Authorities> authorities;
...setters and getters

很明显

  "authorities": [
        {
            "authorityID": 2,
            "authority": "principal"
        }
    ]

在权限表中不存在doest,但为什么hibernate试图使用update而不是insert?我该如何解决这个问题?

任何帮助将不胜感激。

=======================更新======================= =========

有一个快速更新,我通过将CascadeType更改为CascadeType.ALL来解决此问题。但我觉得这不对。好像我想删除一个sigle用户,该机构也将被删除。我对吗?但我尝试删除@GeneratedValue@Id。它只会引发我的错误。而且我认为@GeneratedValue不会影响结果。好像我分配了Id,数据库会存储这个微粒。但是,如果我没有分配Id,数据库将自动生成它。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

当在hibernate上级联时,如果级联实体具有已经持久化的主键,则hibernate将不会持久存在新实体。

对于更新,我假设您的关系是双向的,因此在添加新用户时,hibernate需要更新权限。

答案 1 :(得分:0)

在某些情况下(循环引用),我在使用注释@JsonManagedReference和@JsonBackReference时遇到了问题。

尝试用JsonIgnore替换并手动运行saveAuthorities方法。

答案 2 :(得分:0)

如果要在插入授权时设置ID,则必须从授权实体中删除@GeneratedValue

答案 3 :(得分:0)

找到了一个潜在的解决方案。

我在下面重新定义了用户类

我尝试将插入步骤分开,现在工作正常。 现在一切正常。感谢您提供的所有帮助。