Hibernate,属性更改未被跟踪

时间:2014-08-18 07:59:49

标签: spring hibernate spring-webflow

我正在使用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()之后直接设置属性,也不会跟踪...

我不知道我在这里做错了什么,应该管理实体。有人对此有暗示吗?

谢谢。

2 个答案:

答案 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并在流程的最后保留。