Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么@Valid会导致可重入刷新?_Java_Jpa_Openjpa_Hibernate Validator - Fatal编程技术网

Java 为什么@Valid会导致可重入刷新?

Java 为什么@Valid会导致可重入刷新?,java,jpa,openjpa,hibernate-validator,Java,Jpa,Openjpa,Hibernate Validator,当使用带有@OneToMany关系的@Valid注释时,我得到一个org.apache.openjpa.persistence.InvalidStateException:检测到可重入刷新。尝试更新实体时出现异常。如果没有@Valid注释,更新工作正常 为什么@有效的注释会导致此处出现异常 @Entity @Table(name = "code") public class Code { @Valid // <-- THE PROBLEM @OneToMany(mappe

当使用带有
@OneToMany
关系的
@Valid
注释时,我得到一个
org.apache.openjpa.persistence.InvalidStateException:检测到可重入刷新。
尝试更新实体时出现异常。如果没有
@Valid
注释,更新工作正常

为什么
@有效的
注释会导致此处出现异常

@Entity
@Table(name = "code")
public class Code {

    @Valid // <-- THE PROBLEM
    @OneToMany(mappedBy = "code", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<File> files;

    // ...
}

@Entity
@Table(name = "file")
public class File {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Min(value = 0)
    @Column(name = "id")
    private long id;

    @ManyToOne
    @JoinColumn(name = "code_id")
    private Code code;

    // ...

    @Override
    public int hashCode() {
        return (int) id;
    }
}
完全例外:

<openjpa-2.2.2-r422266:1468616 fatal user error> org.apache.openjpa.persistence.InvalidStateException: Detected reentrant flush.  Make sure your flush-time instance callback methods or event listeners do not invoke any operations that require the in-progress flush to complete.
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2078)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1853)
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:596)
    at org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:683)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1655)
    at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1586)
    at entities.File.pcGetid(File.java)
    at entities.File.hashCode(File.java:144)
    at org.hibernate.validator.internal.engine.ValidationContext$BeanAndPath.hashCode(ValidationContext.java:610)
    at java.util.HashMap.hash(HashMap.java:366)
    at java.util.HashMap.getEntry(HashMap.java:466)
    at java.util.HashMap.get(HashMap.java:421)
    at org.hibernate.validator.internal.engine.ValidationContext.hasMetaConstraintBeenProcessed(ValidationContext.java:336)
    at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1281)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:475)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraint(ValidatorImpl.java:635)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:524)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:349)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:158)
    at org.apache.openjpa.lib.util.J2DoPrivHelper$61.run(J2DoPrivHelper.java:1254)
    at org.apache.openjpa.lib.util.J2DoPrivHelper$61.run(J2DoPrivHelper.java:1252)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.openjpa.persistence.validation.ValidatorImpl.validate(ValidatorImpl.java:278)
    at org.apache.openjpa.validation.ValidatingLifecycleEventManager.fireEvent(ValidatingLifecycleEventManager.java:123)
    at org.apache.openjpa.kernel.BrokerImpl.fireLifecycleEvent(BrokerImpl.java:810)
    at org.apache.openjpa.kernel.StateManagerImpl.fireLifecycleEvent(StateManagerImpl.java:419)
    at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:3007)
    at org.apache.openjpa.kernel.PDirtyState.beforeFlush(PDirtyState.java:39)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1034)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2122)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2082)
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2000)
    at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
    at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1524)
    at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
    at entities.CodePersistenceTest.updateCode(CodePersistenceTest.java:768)
org.apache.openjpa.persistence.InvalidStateException:检测到可重入刷新。确保刷新时间实例回调方法或事件侦听器不会调用任何需要进行中的刷新才能完成的操作。
位于org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2078)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1853)
位于org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:596)
位于org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:683)
位于org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1655)
位于org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1586)
位于entities.File.pcGetid(File.java)
at entities.File.hashCode(File.java:144)
位于org.hibernate.validator.internal.engine.ValidationContext$BeanAndPath.hashCode(ValidationContext.java:610)
位于java.util.HashMap.hash(HashMap.java:366)
位于java.util.HashMap.getEntry(HashMap.java:466)
获取(HashMap.java:421)
位于org.hibernate.validator.internal.engine.ValidationContext.hasMetaConstraintBeenProcessed(ValidationContext.java:336)
位于org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1281)
位于org.hibernate.validator.internal.engine.validateImpl.validateConstraint(validateImpl.java:475)
位于org.hibernate.validator.internal.engine.validateImpl.validateConstraintsForDefaultGroup(validateImpl.java:424)
位于org.hibernate.validator.internal.engine.validateImpl.validateConstraintsForCurrentGroup(validateImpl.java:388)
位于org.hibernate.validator.internal.engine.validateImpl.validateInContext(validateImpl.java:340)
位于org.hibernate.validator.internal.engine.validateCompl.validateCascadConstraint(validateImpl.java:635)
位于org.hibernate.validator.internal.engine.validateImpl.validateCascadConstraints(validateImpl.java:524)
位于org.hibernate.validator.internal.engine.validateImpl.validateInContext(validateImpl.java:349)
位于org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:158)
位于org.apache.openjpa.lib.util.J2DoPrivHelper$61.run(J2DoPrivHelper.java:1254)
位于org.apache.openjpa.lib.util.J2DoPrivHelper$61.run(J2DoPrivHelper.java:1252)
位于java.security.AccessController.doPrivileged(本机方法)
位于org.apache.openjpa.persistence.validation.ValidatorImpl.validate(ValidatorImpl.java:278)
位于org.apache.openjpa.validation.ValidatingLifecycleEventManager.firevent(ValidatingLifecycleEventManager.java:123)
位于org.apache.openjpa.kernel.BrokerImpl.fireLifecycleEvent(BrokerImpl.java:810)
位于org.apache.openjpa.kernel.StateManagerImpl.fireLifecycleEvent(StateManagerImpl.java:419)
位于org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:3007)
位于org.apache.openjpa.kernel.PDirtyState.beforeFlush(PDirtyState.java:39)
位于org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1034)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2122)
位于org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2082)
在org.apache.openjpa.kernel.BrokerImpl.beforepletion上(BrokerImpl.java:2000)
位于org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
位于org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1524)
位于org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
位于org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
在entities.CodePersistenceTest.updateCode(CodePersistenceTest.java:768)

我将OpenJPA 2.2.2与Hibernate Validator 5.0.2一起使用

您引用的是
文件#hashCode()
中的对象id,并使用generation type
IDENTITY
从数据库中的标识列获取id值,即获取id需要访问数据库。显然,您的实体是以一种方式被检测的,这种方式会导致在读取id属性时发生刷新

您可以尝试更改
hashCode()
实现,其方式不是基于主键,而是基于实体的“业务标识”,例如文件名或路径


也就是说,我认为Hibernate验证器不应该在这种情况下调用实体的
hashCode()
方法,所以我已经提交了文件来更改它。

您能展示一下
hashCode()
的实现和您的ID生成策略吗?根据堆栈跟踪,看起来您在数据库中生成了ID,该ID在
hashCode()
中使用,然后在HV调用
hashCode()
方法时导致刷新。我添加了代码
hashCode()
仅存在于
文件
实体。对HV-848的修复没有帮助。现在我看到:
HV000041:调用TraversableResolver.isReachable()引发了一个异常。
删除
@Valid
“修复”了这个问题。您有可以共享的堆栈跟踪吗?
<openjpa-2.2.2-r422266:1468616 fatal user error> org.apache.openjpa.persistence.InvalidStateException: Detected reentrant flush.  Make sure your flush-time instance callback methods or event listeners do not invoke any operations that require the in-progress flush to complete.
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2078)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1853)
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:596)
    at org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:683)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1655)
    at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1586)
    at entities.File.pcGetid(File.java)
    at entities.File.hashCode(File.java:144)
    at org.hibernate.validator.internal.engine.ValidationContext$BeanAndPath.hashCode(ValidationContext.java:610)
    at java.util.HashMap.hash(HashMap.java:366)
    at java.util.HashMap.getEntry(HashMap.java:466)
    at java.util.HashMap.get(HashMap.java:421)
    at org.hibernate.validator.internal.engine.ValidationContext.hasMetaConstraintBeenProcessed(ValidationContext.java:336)
    at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1281)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:475)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraint(ValidatorImpl.java:635)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:524)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:349)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:158)
    at org.apache.openjpa.lib.util.J2DoPrivHelper$61.run(J2DoPrivHelper.java:1254)
    at org.apache.openjpa.lib.util.J2DoPrivHelper$61.run(J2DoPrivHelper.java:1252)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.openjpa.persistence.validation.ValidatorImpl.validate(ValidatorImpl.java:278)
    at org.apache.openjpa.validation.ValidatingLifecycleEventManager.fireEvent(ValidatingLifecycleEventManager.java:123)
    at org.apache.openjpa.kernel.BrokerImpl.fireLifecycleEvent(BrokerImpl.java:810)
    at org.apache.openjpa.kernel.StateManagerImpl.fireLifecycleEvent(StateManagerImpl.java:419)
    at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:3007)
    at org.apache.openjpa.kernel.PDirtyState.beforeFlush(PDirtyState.java:39)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1034)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2122)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2082)
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2000)
    at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
    at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1524)
    at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
    at entities.CodePersistenceTest.updateCode(CodePersistenceTest.java:768)