我有一个如上所述的数据库结构。然后我试图以下面的格式插入一个新的记录
{
"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,数据库将自动生成它。
有什么想法吗?
答案 0 :(得分:0)
当在hibernate上级联时,如果级联实体具有已经持久化的主键,则hibernate将不会持久存在新实体。
对于更新,我假设您的关系是双向的,因此在添加新用户时,hibernate需要更新权限。
答案 1 :(得分:0)
在某些情况下(循环引用),我在使用注释@JsonManagedReference和@JsonBackReference时遇到了问题。
尝试用JsonIgnore替换并手动运行saveAuthorities方法。
答案 2 :(得分:0)
如果要在插入授权时设置ID,则必须从授权实体中删除@GeneratedValue
。
答案 3 :(得分:0)
找到了一个潜在的解决方案。
我在下面重新定义了用户类
我尝试将插入步骤分开,现在工作正常。 现在一切正常。感谢您提供的所有帮助。