gpt4 book ai didi

通过级联持久化对象的 JPA 事务/回滚行为

转载 作者:行者123 更新时间:2023-12-04 15:58:20 25 4
gpt4 key购买 nike

我有两个对象 Antrag(应用程序)和 Anlage(设施)。一个申请可以申请多个设施。应用程序直接保存在 DAO 中。这些设施通过级联保持。

@Entity
@Table(name = "EEG_ANTRAG")
public class Antrag implements Serializable {
private static final long serialVersionUID = -2440344011443487714L;

@Id
@Column(name = "ANT_ID", nullable = false)
@SequenceGenerator(name = "sequenceGeneratorAntrag", sequenceName = "EEG_ANTRAG_SEQ", allocationSize = 1)
@GeneratedValue(generator = "sequenceGeneratorAntrag")
@Getter @Setter private Long id;

@OneToMany(mappedBy = "antrag", cascade = { CascadeType.ALL }, orphanRemoval = true)
@OrderBy("id ASC")
@Getter private List<Anlage> anlageList = new ArrayList<Anlage>();

public Anlage addAnlage(Anlage anlage)
anlageList.add(anlage);
anlage.setApplication(this);
return anlage;
}

/* some more simple attributes; just Strings, boolean, .. */
}

@Entity
@Table(name = "EEG_ANLAGE")
public class Anlage implements Serializable {
private static final long serialVersionUID = -3940344011443487741L;

@Id
@Column(name = "ANL_ID")
@SequenceGenerator(name = "sequenceGeneratorAnlage", sequenceName = "EEG_ANLAGE_SEQ", allocationSize = 1)
@GeneratedValue(generator = "sequenceGeneratorAnlage")
@Getter @Setter private Long id;

@ManyToOne
@JoinColumn(name = "ANL_ANT_ID")
@Getter @Setter private Antrag antrag;

/* some more simple attributes; just Strings, boolean, .. */
}

@Stateless
public class AntragDaoBean implements AntragDaoLocal {
@PersistenceContext(unitName = "ejb-model")
private EntityManager em;

@Override
public void persistAntrag(Antrag antrag) {
em.persist(antrag);
}
}

当插入设施时发生错误时,例如实体中的某些列名拼写错误,会引发异常。堆栈跟踪指示已执行回滚。问题是,应用程序仍然存在。应用程序的插入不应该也回滚吗?
我们正在使用 EclipseLink 2.4.1。 EclipseLink 调试输出指出,所有插入都在一个事务中执行。数据库是Oracle 11g。
我对交易行为的看法是错误的吗?我如何获得我想要的行为?
/* shortened exemplary stacktrace for rollback */
EvaluationException:
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
EJBTransactionRolledbackException:
org.jboss.as.ejb3.tx.CMTTxInterceptor.handleEndTransactionException(CMTTxInterceptor.java:115)
RollbackException:
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1177)
DatabaseException:
org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
SQLSyntaxErrorException:
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)

最佳答案

您的期望是正确的:一切都应该在一个事务中完成,并且插入 Antrag也应该回滚。

我认为您的持久性单元根本不是 JTA:在 persistence.xml 中测试你有这样的文件:

<persistence-unit name="ejb-model" transaction-type="JTA">
<jta-data-source>java:/someNameDB</jta-data-source>

关于通过级联持久化对象的 JPA 事务/回滚行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19655797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com