Spring Hibernate在我尝试插入新记录时使用update
我有一个如上所述的数据库结构。然后我试着插入一个新的记录,以下面的格式发布Spring Hibernate在我尝试插入新记录时使用update,spring,hibernate,Spring,Hibernate,我有一个如上所述的数据库结构。然后我试着插入一个新的记录,以下面的格式发布 { "userId": 2, "firstName": "project", "lastName": "principa;", "username": "principal1", "password": "$2a$04$eFytJDGtjbThXa80FyOOBuFdK2IwjyWefYkMpiBEFlpBwDH.5PM0K", "institution": {
{
"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
权限表中不存在,但为什么hibernate尝试使用更新而不是插入?我怎样才能解决这个问题
任何帮助都将不胜感激
===============================更新================================
有一个快速更新,我通过将CascadeType
更改为CascadeType.ALL
解决了这个问题。但我觉得这是不对的。就像我想删除一个单一用户一样,该机构也将被删除。我说得对吗?但我已尝试删除@GeneratedValue
和@Id
。这只会让我犯错误。我认为,@GeneratedValue
不会影响结果。就像我分配Id一样,数据库将存储该Id。但是,如果我不分配Id,数据库将自动生成它
有什么想法吗?在hibernate上进行级联时,如果级联的实体具有已持久化的主键,hibernate将不会持久化新实体
对于更新,我假设您的关系是双向的,因此hibernate在添加新用户时需要更新权限。我在某些情况下使用注释@JsonManagedReference和@JsonBackReference时遇到问题(循环引用)
尝试用JsonIgnore替换并手动运行saveAuthorities方法。如果要在插入到Authority时设置id,必须从Authority实体中删除
@GeneratedValue
。找到了一个潜在的修复方法
我在下面重新定义了Users类
我尝试分离插入步骤,现在效果很好。
现在一切都很好。感谢您提供的所有帮助。我理解您想要看到的内容,就好像我提供了ID一样,那么Hibernate会认为这已经存在。但是数据库中不存在userID和institutionID,我也证明了hibernate。但是,hibernate插入了该机构并尝试使用insert插入新用户。这里有什么不同?您好,谢谢您的回复。用户类中有一个OMANY,权限类中有多个OMANY。OneToMany由用户映射,在authorities表中我使用JoinColumn(user_id),它是users表中的主键,但在authorities表中是外键。那么在这种情况下,hibernate不会尝试创建新实体吗?如果是,我如何要求创建一个新的?是否从users和Authority类中删除CascadeType.Persistent?若要要求hibernate级联新对象,对象不应包含id或从模型中删除generatedValue注释
"authorities": [
{
"authorityID": 2,
"authority": "principal"
}
]