Java 休眠:在父事务中提交

Java 休眠:在父事务中提交,java,hibernate,transactions,Java,Hibernate,Transactions,我目前正在使用一些遗留代码,通过这些代码可以手动滚动事务。 考虑下面的例子(仅用于说明目的,忽略语法/设计问题): import org.springframework.transaction.TransactionStatus; 导入org.springframework.transaction.support.DefaultTransactionDefinition; 私有平台transactionManager transactionManager; private DefaultTran

我目前正在使用一些遗留代码,通过这些代码可以手动滚动事务。 考虑下面的例子(仅用于说明目的,忽略语法/设计问题):

import org.springframework.transaction.TransactionStatus;
导入org.springframework.transaction.support.DefaultTransactionDefinition;
私有平台transactionManager transactionManager;
private DefaultTransactionDefinition txDefRequired=新的DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_必需);
私有DefaultTransactionDefinition txDefRequiresNew新DefaultTransactionDefinition(TransactionDefinition.PROPAGATION\u REQUIRES\u new);
void createPosts(地图桩){
TransactionStatus状态=transactionManager.getTransaction(txDefRequiresNew)
试一试{
//posts映射由用户名:posttext密钥对组成
for(Map.Entry:posts.entrySet()){
//构建在线帖子
createPost(entry.getKey(),entry.getValue());
}
transactionManager.commit(状态);
}最后{
如果(!status.isCompleted()){
transactionManager.rollback(状态);
}
}
}
void createPost(字符串用户名、字符串文本){
TransactionStatus状态=transactionManager.getTransaction(txDefRequired)
//构建在线帖子
OnlinePost p=新的OnlinePost(文本);
用户u=解析用户(用户名);
p、 setUser(u);
transactionManager.commit(状态);//刷新会话
}
用户解析用户(字符串用户名){
TransactionStatus状态=transactionManager.getTransaction(txDefRequired)
用户u=getUser(用户名);
如果(u==null)
createUser(用户名);
返回u;
transactionManager.commit(状态);//刷新会话
}

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

否。提交将始终结束工作单元并将更新推送到数据库。另一方面,刷新不会将更改提交给数据库(如提交更改以便对每个人可见)。从技术上讲,您可以回滚一个刷新的更改。 寻找可能的副本


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

关于
flush
的声明不正确。允许持久性提供程序在db中显化更改(只是不提交更改),但保留读取提交的语义。感谢您指出这一点。我应该更清楚一点。当我说将更改推送到db时,我确实在考虑其他人可以看到的更改。现在编辑。这不是我的经验。持久化对象只在最后一次外部提交(在createPosts()中)时被推送到数据库,但无可否认,我刚刚注意到我的代码使用了事务管理器,请允许我更新这个问题。
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

}