首页 文章

Hibernate:在父事务中提交

提问于
浏览
0

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

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 回答

  • 1

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

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

相关问题