Я нашел решение этой проблемы без необходимости изменять Java структуру графа объекта и иметь ссылки на Syntheti c Classes / stati c.
- Реализовать CustomBinaryHandler для объекта, который имеет Syntheti c Classes / stati c reference
- Переопределить метод store
- Переопределить create method
- Переопределить initializeState method
Store
Если ссылка на Syntheti c Classes / stati c ссылки создают новый экземпляр объекта и устанавливают ссылку на «маркер». В моем случае до нуля. Не обновляйте текущий объект, переданный в метод store , обязательно создайте клон и измените применимую ссылку. Затем вызовите super.store ()
create
Создайте пустой экземпляр объекта
initializeState
- Получить значения для объекта
- Если у рассматриваемого значения есть 'маркер', установите его на Syntheti c Classes / stati c reference
- Создайте объект-клон и заполните его значения
- XReflect.copyFields от клона до реального экземпляра
public class ExampleTypeHandler extends CustomBinaryHandler<Example> {
private static Class<Example> handledType() {
return Example.class; // to get ".class" to work
}
//the fields to be persisted
BinaryField<Example> accompanying = Field(Object.class, Example::getAccompanying);
BinaryField<Example> resulting = Field(Object.class, Example::getResulting);
public ExampleTypeHandler()
{
super(handledType());
}
@Override
public void store(Binary data, Example dtl, long objectId, PersistenceStoreHandler<Binary> handler) {
if (dtl.getAccompanying() == MetaDataAccompanying.DUMMY) {
dtl = Example.of(dtl.getResulting(), null);
}
super.store(data, dtl, objectId, handler);
}
@Override
public Example create(final Binary data, final PersistenceLoadHandler handler) {
return Example.of(null, null);
}
@Override
public void initializeState(final Binary data, final Example instance, final PersistenceLoadHandler handler) {
//get the referenced Objects
Object accompanying = this.accompanying.readReference(data, handler);
String r = (String)this.resulting.readReference(data, handler);
if (accompanying == null) {
accompanying = MetaDataAccompanying.DUMMY;
}
MetaDataAccompanying a = (MetaDataAccompanying) accompanying;
Example dtl = Example.of(r, a);
XReflect.copyFields(dtl, instance);
}
}