2010-03-18 3 views
2

Prevayler 배포판에 포함 된 데모는 객체를 생성하거나 업데이트하기 위해 몇 개의 문자열 (또는 그와 유사한 간단한 코드)을 명령 생성자로 전달하는 방법을 보여줍니다. 문제는 많은 필드가있는 MyObject라는 개체가 있다는 것입니다. CreateMyObject 명령을 모두 수동으로 전달해야한다면 고통이 될 것입니다.Prevayler 명령으로 복잡한 객체 작업하기

그래서 내가 생각한 대안은 내 비즈니스 객체 자체를 명령에 전달하는 것이지만 복제본에 매달리는 것입니다 (명령에 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는 말한다 :

거래는 직접 객체 참조를 수행 할 수 없습니다 (포인터) 비즈니스 개체. 이것은 초심자의 함정이기 때문에 침례 문제로 알려졌습니다. 트랜잭션이 저널에 직렬화 된 후 실행을 위해 deserialize되면 객체 참조는 더 이상 의도 한 객체를 참조하지 않기 때문에 - 직접 참조 된 객체는 직렬화에 의해 복사되기 때문에 직접 객체 참조가 작동하지 않습니다 방법! 따라서 트랜잭션은 참조하려는 오브젝트에 대해 일종의 문자열 또는 숫자 식별자를 가져와야하며 실행될 때 오브젝트를 검색해야합니다.

나는 내가 가지고있는 ... 나는 "직접 객체 포인터"문제를 해결 점점됩니다 개체에-통과,하지만 난 여전히 좋은 생각인지 여부를 모르는

답변

1

원래 개체에 다른 개체에 대한 참조가 없는지 확인하지 않으면 복제가 침례 문제를 해결하는 데 도움이되지 않습니다. 하지만 그건 당신이 묘사 한 것과는 다른 문제입니다.

많은 createCommands를 작성하지 않으려면 이름 - 값 쌍 사전과 생성 할 클래스의 키를 전달하십시오.

0

를 복제하여 생각 결코이 Prevayler을 사용하지 않고 내가 문제를 이해한다면 모르겠지만, 당신은 자신에게 대답했다 생각 : 한 번 트랜잭션이 되었기 때문에

직접 객체 참조가 작동하지 않습니다를 저널에 연재하고 그런 다음 객체를 실행하기 위해 비 직렬화 참조는 더 이상 의도 객체 - - 그들은 첫번째 뜻 에서 언급 한 어떠한 개체 MyObject에 누구와도 바꿀 수없는 다이애나의 식별자를 유지 CreateMyObject에 직렬화 프로세스

의해 복사되어있다. 참조가 아닙니다. 복제는 여기에 할 일이 없습니다.