假设我有一个父/子模型,我想在同一个事务中保存父项及其子项,只使用本机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查询在同一个事务中插入父和子?
谢谢,
/马克西姆
答案 0 :(得分:0)
我发现了我的错误,我在第二个插页中移了两列,这就是为什么我遇到了禁令违规例外。
很抱歉。
可以删除此主题。