Демонстрации, включенные в дистрибутив Prevayler, показывают, как передать пару строк (или что-то подобное) в конструктор команд для создания или обновления объекта. Проблема в том, что у меня есть объект с именем MyObject, который имеет много полей. Если бы мне пришлось передать все из них в команду CreateMyObject вручную, это было бы болезненно.
Итак, альтернатива, о которой я подумал, - передать сам мой бизнес-объект в команду, но привязаться к его клону (имея в виду, что я не могу сохранить BO непосредственно в команде). Конечно, после выполнения этой команды мне нужно было бы избавиться от оригинальной копии, которую я передал.
public class CreateMyObject implements TransactionWithQuery {
private MyObject object;
public CreateMyObject(MyObject business_obj) {
this.object = (MyObject) business_obj.clone();
}
public Object executeAndQuery(...) throws Exception {
...
}
}
Prevayler wiki говорит:
Транзакции не могут переносить прямые ссылки на объекты (указатели) на бизнес-объекты. Это стало известно как проблема крещения, потому что это распространенная ошибка новичка. Прямые ссылки на объекты не работают, потому что после того, как транзакция была сериализована в журнал и затем десериализована для выполнения, ее ссылки на объекты больше не ссылаются на предполагаемые объекты - любые объекты, на которые они могли ссылаться сначала, будут скопированы сериализацией процесс! Следовательно, транзакция должна содержать некие строковые или числовые идентификаторы для любых объектов, на которые она хочет сослаться, и она должна искать объекты при выполнении.
Я думаю, что путем клонирования переданного объекта я обойду проблему «прямого указателя объекта», но я до сих пор не знаю, является ли это хорошей идеей ...