Работа со сложными объектами в командах Prevayler - PullRequest
2 голосов
/ 18 марта 2010

Демонстрации, включенные в дистрибутив 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 говорит:

Транзакции не могут переносить прямые ссылки на объекты (указатели) на бизнес-объекты. Это стало известно как проблема крещения, потому что это распространенная ошибка новичка. Прямые ссылки на объекты не работают, потому что после того, как транзакция была сериализована в журнал и затем десериализована для выполнения, ее ссылки на объекты больше не ссылаются на предполагаемые объекты - любые объекты, на которые они могли ссылаться сначала, будут скопированы сериализацией процесс! Следовательно, транзакция должна содержать некие строковые или числовые идентификаторы для любых объектов, на которые она хочет сослаться, и она должна искать объекты при выполнении.

Я думаю, что путем клонирования переданного объекта я обойду проблему «прямого указателя объекта», но я до сих пор не знаю, является ли это хорошей идеей ...

Ответы [ 2 ]

1 голос
/ 06 мая 2010

Клонирование не поможет вам решить проблему крещения, если только вы не убедитесь, что исходный объект не имеет ссылок на другие объекты. Но это другая проблема, чем то, что вы описали.

Если вы не хотите писать так много createCommands, передайте словарь пар имя-значение и ключ к классу для создания.

0 голосов
/ 14 апреля 2010

Я никогда не использовал Prevayler, и я не уверен, что понимаю вашу проблему, но я думаю, что вы дали себе ответ:

Прямые ссылки на объекты не работают потому что, как только транзакция была сериализовано в журнал, а затем десериализовать для исполнения своего объекта ссылки больше не относятся к предполагаемые объекты - любые объекты, которые они возможно, ссылались на первое были скопированы сериализацией процесс

В CreateMyObject сохраните уникальный идентификатор MyObject. Не ссылка. Клонирование тут не при чем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...