我有一个对象列表。它们是 JPA“位置”实体。
List<Location> locations;
我有一个无状态的 EJB,它遍历列表并保留每个列表。
public void createLocations() {
List<Locations> locations = getListOfJPAManagedLocationEntities(); // I'm leaving out the details of this because it has nothing to do with the issue
for(Location location : locations) {
em.persist(location);
}
}
代码工作正常。我没有任何问题。但是,问题是:我希望这是一个全有或全无的交易。目前,每次通过 for 循环,persist() 方法都会在数据库中插入一个新行。假设我有 100 个位置对象,而第 54 个对象有问题并引发异常。将有 53 条记录插入到数据库中。我想要的是:他们都必须先成功,然后才能成功。
我正在使用最新最好的 Java EE6、EJB 3.x 和 JPA 2 版本。我的 persistence.xml 使用 JTA。
<persistence-unit name="myPersistenceUnit" transaction-type="JTA">
我喜欢有 JTA。我不想停止使用 JTA。90% 的时间 JTA 完全按照我的意愿去做。但在这种情况下,我似乎没有。
我对 JTA 的理解一定是不准确的,因为我一直认为 EJB 方法的开始和结束标记了 JTA 事务的边界(假设只有一种方法在起作用,如上所示)。按照我的逻辑,在 for 循环完成并且方法返回之前,事务不会结束,然后记录就会被持久化。
我正在使用 SqlServer 2008 的 JTDS 驱动程序。也许数据库不想在不立即提交记录的情况下插入记录。实体 id 定义如下:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
我检查了规范,在 JTA 环境中调用各种“UserTransaction”或“getTransaction()”方法是不合适的。
那么我能做什么呢?谢谢。