Hibernate收回vs清除没有id的对象

Hibernate收回vs清除没有id的对象,hibernate,session,Hibernate,Session,我试图理解,如果我们创建实体的新用户实例,则会发生什么情况?如果创建实体的实例并调用session.flush()或session.execute(用户),则在hibernate session.flush(用户)或session.execute(用户)中使用没有id的用户,实例将不会持久化,即不会写入数据库 现在的问题是,如果您已使实例持久化,该怎么办?(通过调用save()、saveOrUpdate()、persist()或merge()。为了持久化实例,必须设置它的主键,即id。如果您在表

我试图理解,如果我们创建实体的新用户实例,则会发生什么情况?如果创建实体的实例并调用session.flush()或session.execute(用户),则在hibernate session.flush(用户)或session.execute(用户)中使用没有id的用户,实例将不会持久化,即不会写入数据库

现在的问题是,如果您已使实例持久化,该怎么办?(通过调用save()、saveOrUpdate()、persist()或merge()。为了持久化实例,必须设置它的主键,即id。如果您在表中为id应用了“自动递增”,则只保存实例,否则您将得到异常
java.sql.SQLException:字段“id”没有默认值

我们假设id是“自动递增”的,实体是持久化的。调用session.flush()将显式地写入数据库(通常Hibernate会在会话结束时写入数据库,以避免多次数据库命中)

调用session.execute(对象)将使该实例分离。会话关闭或手动刷新会话后,将对数据库进行输入。调用execute()后对实例所做的修改将不会写入数据库

分离-分离实例是一个已持久化的对象,但其会话已关闭。当然,对对象的引用仍然有效,在这种状态下甚至可能修改分离的实例。分离的实例可以在稍后的时间点重新连接到新会话,使其(以及所有修改)再次持久化。此功能为需要用户思考时间的长时间运行的工作单元启用编程模型。我们称之为应用程序事务,即从用户的角度来看的工作单元

从会话缓存中删除此实例。对实例的更改将不会与数据库同步。如果关联映射为cascade=“execute”,则此操作将级联到关联实例

session.execute()只更改对象从持久-->分离状态的状态,即从会话缓存中删除实体。分离并不意味着实例将从数据库中删除。要删除实例,必须调用delete()或remove()

刷新是将底层持久存储与内存中的持久状态同步的过程