HIbernate:使用本机查询抛出同一事务中的2个相关对象抛出ConstraintViolationException

时间:2015-12-17 11:04:37

标签: hibernate

假设我有一个父/子模型,我想在同一个事务中保存父项及其子项,只使用本机sql查询。

我使用preparedStatement插入父级并获取他的id:

        session.doWork(new Work() { 

        @Override
        public void execute(Connection connection) throws SQLException {

            PreparedStatement pstmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);

以下是查询:

final String query = "insert into parent(id,name) values (?,?)

我得到这样的父ID:

ResultSet rs = pstmt.getGeneratedKeys();
            if (rs!=null && rs.next()) {
                parent.setId(rs.getInt(1));

然后,在同一项工作中,我使用另一个preparedStatement将他的孩子用外键插入他的父母。

我检查了它是否仍然是同一个事务,使用其哈希码并且它是相同的。

当我得到ConstraintViolationException时,说父ID不存在。

org.hibernate.exception.ConstraintViolationException: could not execute native bulk manipulation query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219)
at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1300)
at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:365)

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_CHILDREN_REFERENCE_PARENT". The conflict occurred in database "db", table "dbo.PARENT", column 'ID'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1522)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)

但是,如果我在插入孩子之前对父ID进行选择,则表示他存在。

我不知道我想做什么是可能的,我怎么能确保只使用本机sql查询在同一个事务中插入父和子?

谢谢,

/马克西姆

1 个答案:

答案 0 :(得分:0)

我发现了我的错误,我在第二个插页中移了两列,这就是为什么我遇到了禁令违规例外。

很抱歉。

可以删除此主题。