Коллеги, добрый день!
Не могу понять, что я делаю не так. Помогите, пожалуйста. Перепробовал уже массу вариантов…
Вычленить демо-проект затруднительно, поэтому приведу детальное описание ниже.
Задача: при сохранении экземпляра базовой сущности (Entry) необходимо создавать (и инициализировать по определенным правилам) экземпляр связанной (1:1 композиция) сущности (LegacyIdMap). Ну и устанавливать связь между ними.
Решение описанное ниже приводит к очень странному поведению:
После сохранения базовой сущности вначале (на экране базовой сущности) как будто LegacyIdMap не создалось и связь не установилась (повторный логин в приложение, повторное открытие экрана - ни к чему не приводит). Но, если перезапустить Tomcat, то при открытии экрана базовой сущности можно наблюдать новую связанную сущность!
Вот первая сущность:
@Entity(name = "myproj_Entry")
@NamePattern("%s|id")
public class Entry extends StandardEntity {
private static final long serialVersionUID = 7203339880710608935L;
@Composition
@OnDelete(DeletePolicy.CASCADE)
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "LEGACY_ID")
private LegacyIDMap legacyId;
}
Вот вторая сущность:
@Entity(name = "myproj_LegacyIDMap")
@NamePattern("%s|value")
public class LegacyIDMap extends StandardEntity {
private static final long serialVersionUID = 1976972529771139284L;
@Column(name = "VALUE_", nullable = false, length = 32)
@Length(message = "{msg://myproj_LegacyIDMap.value.validation.Length}", max = 32)
@NotNull
private String value;
}
Для решения создан слушатель:
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void beforeCommit(EntityChangedEvent<Entry, UUID> event) {
// текущий элемент
//EntityManager em = persistence.getEntityManager();
//Entry entry = em.find(Entry.class, event.getEntityId().getValue(), "entry-with-classifier");
Entry entry = transactionalDataManager
.load(event.getEntityId())
.view("entry-with-classifier")
.one();
if (EntityChangedEvent.Type.CREATED.equals(event.getType())) {
// todo... запись нового вычисленного LegacyId...
// todo... ИТОГОВАЯ ЗАПИСЬ ПРОХОДИТ ПОСЛЕ ПЕРЕЗАГРУЗКИ СЕРВЕРА!!!
// создать запись для хранения LegacyId
LegacyIDMap legacyIDMap = metadata.create(LegacyIDMap.class);
Integer maxLegacyId = myConfigService.getMaxLegacyId();
legacyIDMap.setValue(Integer.toString(maxLegacyId + 1));
transactionalDataManager.save(legacyIDMap);
// update текущей Entry
entry.setLegacyId(legacyIDMap);
transactionalDataManager.save(entry, "entry-with-classifier");
}
}
А вот так прописан просмотр связи в экране базовой сущности (public class EntryEdit extends StandardEditor<Entry>
):
<data>
<instance id="entryDc"
class="com.company.myproj.entity.Entry">
<view extends="entry-with-classifier" systemProperties="true">
<property name="legacyId" view="_minimal"/>
</view>
<loader/>
<instance id="legacyIdDc" property="legacyId"/>
</instance>
</data>
...
...
<pickerField id="legacyIdField" dataContainer="entryDc" property="legacyId" width="140">
<actions>
<action id="open_composition" type="picker_open_composition"/>
<action id="clear" type="picker_clear"/>
</actions>
</pickerField>
Перепробовал уже массу вариантов… Выручайте