Hibernate:在父事务中提交

时间:2014-04-30 10:22:31

标签: java hibernate transactions

我目前正在使用一些遗留代码来手动滚动交易。 请考虑以下内容(示例仅用于说明目的,忽略语法/设计问题):

import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

private PlatformTransactionManager transactionManager;
private DefaultTransactionDefinition txDefRequired = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
private DefaultTransactionDefinition txDefRequiresNew new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);


void createPosts(Map<String, String> posts){

    TransactionStatus status = transactionManager.getTransaction(txDefRequiresNew)
    try {
        // posts Map is made up for username:posttext key pair
        for (Map.Entry<String, String> entry : posts.entrySet()) {
            // Construct online post
            createPost(entry.getKey(), entry.getValue());
        }
        transactionManager.commit(status); 
    } finally {
        if (!status.isCompleted()) {
            transactionManager.rollback(status);
        }

    }
}

void createPost(String username, String text){

    TransactionStatus status = transactionManager.getTransaction(txDefRequired)

    // Construct online post
    OnlinePost p = new OnlinePost(text);
    User u = resolveUser(username);
    p.setUser(u);

    transactionManager.commit(status); // flush the session
}

User resolveUser(String username){

    TransactionStatus status = transactionManager.getTransaction(txDefRequired)
    User u = getUser(username);
    if(u == null)
        createUser(username);
    return u;
    transactionManager.commit(status); // flush the session

}

在这个特定的流程中, tx.commit()在被调用的方法中,例如 resolveUser(),只会用于刷新是否正确会话(flush-mode = auto)并返回一个新的持久化实体,其中生成并分配了一个人工主键,以便您以后可以在同一个事务中使用它?

1 个答案:

答案 0 :(得分:1)

没有。提交将始终结束工作单元并将更新推送到数据库。另一方面,刷新不会将更改提交到db(就像提交它们一样,以便每个人都可以看到)。你可以在技术上回滚一个刷新的变化。 https://stackoverflow.com/a/14626510/2231632可能重复。

使用人工主键你需要的是什么,你可以使用Session.flush。但是如果要在同一个txn中使用该密钥,请不要提交txn。