【发布时间】:2015-07-24 18:08:41
【问题描述】:
问题是下面的代码 sn -p 没有删除数据库中的记录。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
...
...
void deleteForm() {
Session session = sessionFactory.openSession();
FormDO formDO = new FormDO();
formDO.setId(formId);
session.delete(formDO); // No delete SQL query is getting fired.
但是,如果我在删除后调用 session.flush(),它会完美运行。请注意,我没有使用任何交易。
Session类的JavaDoc中delete方法的描述是:
从数据存储中删除一个持久实例。该参数可以是与接收会话相关联的实例,也可以是瞬态实例,其标识符与现有持久状态相关联。
而且我在网上看到很多sn-ps的代码,说明在delete()之后不需要调用flush()。其他论坛here 也提出了类似的问题,但仍未得到解答。
此外,没有 session.flush,session.save 也能正常工作。
我正在使用 Hibernate 4.2.16 + Spring 4.0.9 + JPA 1.0 注释。以下是源文件供进一步参考,
FormDO.java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="form")
public class FormDO {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
Integer id;
@Column(name="name")
String name;
...
...
Spring 配置文件
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/tempdb" />
<property name="username" value="root" />
<property name="password" value="****" />
</bean>
<!-- Hibernate 4 SessionFactory Bean definition -->
<bean id="hibernate4AnnotatedSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.test.FormDO</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
FormDAO.java
@Named
public class FormDAO {
@Inject
private SessionFactory sessionFactory;
public boolean deleteForm(Integer formId) {
Session session = sessionFactory.openSession();
FormDO formDO = new FormDO();
formDO.setId(formId);
session.delete(formDO);
session.flush(); // If this line is commented, record DOES NOT get deleted
return true;
}
public boolean saveForm(FormDO formDO) {
Session session = sessionFactory.openSession();
session.save(formDO); // Save doesn't require session.flush
return true;
}
...
...
更新:
我的困境主要是由于不一致.. session.save 立即插入记录,但 session.delete 不会反映,除非显式调用 flush()。但是当我参考 Afsun 发布的Flushing the Session 链接时,我的疑虑通过阅读以下行消除了,
一个例外是使用原生 ID 生成的对象在保存时被插入。
我非常感谢大家发布的答案,因为几乎所有人都指向了正确的方向,但 Afsun 完全消除了我的疑问。谢谢!
【问题讨论】: