我正在使用spring webflow 2.4和hibernate 4.3编写一个Web应用程序。 调用persist()后,我对实体所做的更改有问题。这些更改不会被跟踪,甚至在流程结束之前调用saveOrUpdate也无济于事(无论如何都应该没用)。
Hib配置
<bean id="oracleDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db.oracle.url}" />
<property name="username" value="${db.oracle.user}" />
<property name="password" value="${db.oracle.password}" />
</bean>
<bean id="oracleSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="oracleDataSource" />
<property name="entityInterceptor">
<bean class="be.core.dao.interceptor.AuditInterceptor"/>
</property>
<property name="hibernateProperties">
<value>
hibernate.temp.use_jdbc_metadata_defaults=false
hibernate.default_schema=
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
</value>
</property>
<property name="packagesToScan">
<value>domain</value>
</property>
</bean>
实体:
@Entity
@Table(name = "ACT")
@SequenceGenerator(name = "ACT_SEQ", sequenceName = "ACT_SEQ")
public class Act extends BaseEntity<Long> {
private static final long serialVersionUID = -731258565201165908L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "ACT_SEQ")
@Column(name="ACTNUM")
private Long id;
@NotFound(action=NotFoundAction.IGNORE)
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="SOCNUM")
private Enterprise enterprise;
@DateFormat(pattern = "dd/MM/yyyy")
@Temporal(TemporalType.DATE)
@Column(name="ACTEDATE")
private Date date;
@Column(name = "ACTE", nullable = false, length = 12)
private String actRef;
流量控制器中的代码:
public Act createBaseAct(Enterprise enterprise, User user) {
Act act = new Act(enterprise);
act.setWho(user.getWho());
act.setSource(SOURCE);
actDao.persist(act);
return act;
}
调用persist()时,使用声明的序列正确生成id。
在流程结束时,执行提交但导致错误,因为属性actRef在persist()之后设置并且未被跟踪:
DEBUG: org.hibernate.SQL - insert into ACT (DATCRE, MAJD, version, QUI, ACTE, ACTEDATE, SOCNUM, ACTENOPG, ACTELNG, ACTEDRPG, ACTESRC, ACTENUM) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
TRACE: org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl - Registering statement [oracle.jdbc.driver.OraclePreparedStatement@181496]TRACE: org.hibernate.persister.entity.AbstractEntityPersister - Dehydrating entity: [domain.Act#236871950]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [DATE] - [Mon Aug 18 09:35:11 CEST 2014]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [DATE] - [Mon Aug 18 09:35:11 CEST 2014]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [3] as [INTEGER] - [0]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [4] as [VARCHAR] - [QP]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [5] as [VARCHAR] - [null]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [6] as [DATE] - [Mon Aug 18 09:35:11 CEST 2014]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [7] as [BIGINT] - [404371]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [8] as [INTEGER] - [1]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [9] as [VARCHAR] - [null]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [10] as [INTEGER] - [1]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [11] as [VARCHAR] - [6010]
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [12] as [BIGINT] - [236871950]
DEBUG: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a]
java.sql.SQLException: ORA-01400: cannot insert NULL into ("ACT"."ACTE")
在流程执行中进一步设置了一些属性,但即使我在persist()之后直接设置属性,也不会跟踪...
我不知道我在这里做错了什么,应该管理实体。有人对此有暗示吗?
谢谢。
答案 0 :(得分:0)
调用persist()时,使用。正确生成id 宣布序列。
这是不可能的,因为你在ACTE
字段上有not_null约束。
查看STrace中的最后一行。
错误正确地指出了cannot insert NULL into ("ACT"."ACTE")
在actRef
对象之前,您必须在persist()
中设置值。
答案 1 :(得分:0)
是的我知道这是因为非空约束,这是非常清楚的。我想的是,hibernate将执行插入然后更新,并在persist之后执行更改...这就是为什么它是SQL异常的原因。我希望hibernate在创建insert语句之前解析对实体所做的更改。显然没有办法强制执行,除了在流程的最后坚持 问题是我需要尽快生成id,因为它在同一流程中创建的其他实体中用作软引用。
我的解决方案是手动生成id并在流程的最后保留。