【发布时间】:2016-02-09 14:28:13
【问题描述】:
我正在使用 Eclipselink 的 Amdatu 实现来实现 OSGI 兼容性。
谁能发现为什么这不起作用?
下面的类被定义为一个实体并且应该被持久化。每次对 Ptz2PlPalletUnloadOrder 进行更新时,OrderRepoImpl 中的 save 方法都会将持久化订单与更新版本合并,其中 Ptz2PlPalletUnloadDefinition def 或 OrderState orderState 已更改。
无论如何,我可以使用 em.merge 方法更新数据库中的 orderState,但我无法更新 BD 中的 @Embedded def 对象。更新而不在数据库中创建新行是非常受欢迎的。
合并对象时不抛出异常,log4j包含在问题的底部。
Ptz2PlPalletUnloadOrder
@Entity(name = Ptz2PlPalletUnloadOrder.TABLE_NAME)
@Table(name = Ptz2PlPalletUnloadOrder.TABLE_NAME)
public class Ptz2PlPalletUnloadOrder implements Order {
public static final String TYPE = "ptz2pl.pallet.unload";
public static final String TABLE_NAME = "order_ptz2pl_pallet_unload";
// Order ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long dbId;
@Temporal(TemporalType.TIMESTAMP)
private Date created = new Date();
// States
@Enumerated(EnumType.STRING)
private OrderState orderState = OrderState.NEW;
@Embedded
private Ptz2PlPalletUnloadDefinition def;
}
Ptz2PlPalletUnloadDefinition
持久化类。
@Embeddable
public class Ptz2PlPalletUnloadDefinition {
@Embedded
private Station station;
private volatile Integer agvId;
private volatile String agvSystemName;
@Temporal(TemporalType.TIMESTAMP)
private Date deadLine;
private String userId;
private Long palletType;
private Ptz2PlPalletUnloadDefinition() {
}
}
OrderRepoImpl
@Transactional
@Component(provide = ManagedTransactional.class)
public class OrderRepoImpl implements OrderRepo, ManagedTransactional {
private EntityManager em;
@Override
public Ptz2PlPalletUnloadOrder save(Ptz2PlPalletUnloadOrder order) {
Ptz2PlPalletUnloadOrder result = em.merge(order);
return result;
}
}
通过此方法制动时,结果值具有正确的值。所以人们会期望数据库已经更新,但是当Ptz2PlPalletUnloadOrder的待更新字段是嵌入对象时,这种不幸不会发生。
日志
[EL Finer]: 2016-02-09 15:25:32.393--ServerSession(1465675217)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--client acquired: 2038620953
[EL Finer]: 2016-02-09 15:25:32.393--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--TX binding to tx mgr, status=STATUS_ACTIVE
[EL Finer]: 2016-02-09 15:25:32.394--ClientSession(2038620953)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--acquire unit of work: 769186
[EL Finest]: 2016-02-09 15:25:32.395--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--Merge clone with references Ptz2PlPalletUnloadOrder [id=1, orderState=QUEUED, location=Location [stationId=10, systemName=BEING], allocatedAgvId=null, allocatedAgvSystemName=null]
[EL Finer]: 2016-02-09 15:25:37.014--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--TX beforeCompletion callback, status=STATUS_ACTIVE
[EL Finer]: 2016-02-09 15:25:37.015--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--begin unit of work commit
[EL Finer]: 2016-02-09 15:25:37.016--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--TX afterCompletion callback, status=COMMITTED
[EL Finer]: 2016-02-09 15:25:37.017--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--end unit of work commit
[EL Finer]: 2016-02-09 15:25:37.018--UnitOfWork(769186)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--release unit of work
[EL Finer]: 2016-02-09 15:25:37.019--ClientSession(2038620953)--Thread(Thread[pool-7-thread-4,5,Configuration Admin Service])--client released
【问题讨论】:
-
allocatedAgvId和allocatedAgvSystemName设置为 null,因此正在更新定义。我怀疑这些是唯一发生变化的字段(因为它们被标记为 volatile)。 -
@Thomas 我认为我的问题措辞错误并重新措辞。当
OrderState orderState或Ptz2PlPalletUnloadDefinitiondef 已更改时,我想更新持久化(数据库)对象。它确实适用于第一个变量,但不适用于后者。 -
你能提供一个改变
def的例子吗?只需用另一个相等的实例(相同的值)替换该实例不应导致任何更改,因为实际上 def 仍然相同。 -
@Thomas def 中的
palletType和station在初始化def 时在某些情况下将没有值(null)。它们的值在数据库中将为空。当Order被“启动”时,会从另一个来源获取值,并且应该更新订单。启动Order也会将orderState从状态更新为活动状态。 -
您如何获取和更改值?
标签: java sql-server osgi eclipselink amdatu