Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 Hibernate问题“批更新从更新[0]返回意外的行数;实际行数:0;应为1”_Java_Mysql_Spring_Hibernate - Fatal编程技术网

Java Hibernate问题“批更新从更新[0]返回意外的行数;实际行数:0;应为1”

Java Hibernate问题“批更新从更新[0]返回意外的行数;实际行数:0;应为1”,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,我正在使用Jersey+spring+hibernate4.17开发api系统;问题是如果同时调用两次cleaFields,第二次调用将抛出一个异常,如下所示 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 at org.hibernate.jdbc.Expectations$Bas

我正在使用Jersey+spring+hibernate4.17开发api系统;问题是如果同时调用两次cleaFields,第二次调用将抛出一个异常,如下所示

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
    at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.checkRowCounts(BatchingBatch.java:133)
    at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:110)
    at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.doExecuteBatch(BatchingBatch.java:101)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.execute(AbstractBatchImpl.java:149)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.executeBatch(JdbcCoordinatorImpl.java:162)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:357)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:280)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
控制器中的clearFields方法

@Transactional(isolation=Isolation.REPEATABLE_READ)
public void clearFields(Integer userId) {
    User user = this.userDao.get(userId);
    user.getFields().clear();
    userDao.flush(); //call the current session.flush(); this line can throw exception.
}
用户实体类

@Entity
@Table(name="users")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")

public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id", unique = true, nullable = false)
    private int userId;


    @OneToMany(mappedBy = "user", cascade = { CascadeType.ALL }, targetEntity = UserProfile.class, fetch = FetchType.LAZY, orphanRemoval=true)
    @OrderBy("id")
    private List<UserProfile> fields = new ArrayList<UserProfile>();

    public User() {
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public List<UserProfile> getFields() {
        return fields;
    }

    public void setFields(List<UserProfile> fields) {
        this.fields = fields;
    }

}
我做了一些研究,根本原因是如果第二个调用获取了一些字段,并且在删除它们之前,第一个调用已经从数据库中删除了所有字段

换句话说,第二个呼叫尝试删除一些已经被其他人删除的记录


如何解决此问题?

查看包含错误的代码?不要在这里发布所有代码。为什么要在此时手动刷新会话?事实上,下面有一些代码添加了一些字段,因此我想清除所有旧字段,然后添加新字段。我使用锁定模式解决了这个问题。查询用户对象时写悲观;我不知道是否有更好的解决办法;但无论如何,解决方案是有效的。
@Entity
@Table(name="user_profiles")
public class UserProfile implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;


    @Column(name="field_name")
    private String fieldName;


    @ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user;

    private String value;


    public UserProfile() {

    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }


    public String getFieldName() {
        return this.fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }


    public String getValue() {
        return this.value;
    }

    public void setValue(String value) {
        this.value = value;
    }


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}