Слияние существующего объекта не обновляет измененный @Embedded в базе данных
Я использую реализацию Eclipselink Amdatu для совместимости с OSGI.
Может кто-нибудь определить, почему это не работает?
Класс ниже определяется как сущность и должен быть сохранен. Каждый раз, когда выполняется обновление для Ptz2PlPalletUnloadOrder, метод save в OrderRepoImpl объединяет постоянный заказ с обновленной версией, в которой были изменены def Ptz2PlPalletUnloadDefinition или OrderState orderState.
В любом случае, я могу обновить orderState в базе данных с помощью метода em.merge, но не могу обновить объект @Embedded def в BD. Обновление без создания новой строки в базе данных является наиболее предпочтительным.
При объединении объекта исключение не выдается, 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
1 ответ
Я воспроизвел это в тестовом наборе amdatu-jpa.
Нашел похожий вопрос на форуме EclipseLink https://www.eclipse.org/forums/index.php/t/474144/
Отключение плетения решает проблему в тесте, который я создал. Чтобы отключить добавьте свойство ниже в persistence.xml
<property name="eclipselink.weaving" value="false"/>