• Базы данных
  • Oracle
  • Использование Oracle Berkeley DB Java Edition как менеджера хранения объектов для Google Web Toolkit

Использование Oracle Berkeley DB Java Edition как менеджера хранения объектов для Google Web Toolkit - Удаленные сервисы, бизнес-сервисы и средства доступа

ОГЛАВЛЕНИЕ

Удаленные сервисы, бизнес-сервисы и средства доступа

Remote Services, Business Services, and Accessors

К данному моменту концептуальные сущности (conceptual entities) созданы и должным образом аннотированы с применением аннотаций DPL в Berkeley DB Java Edition. Методы базисных сервисов должны управлять состояниями транзакций этих сущностей. Следующий шаг - это создание GWT Remote Services. Они будут вызывать код DPL в Berkeley DB Java Edition для хранения данных. Remote Services - это стандартный способ коммуникаций с сервером приложений Java EE со стороны браузера на стороне клиента. Это делается с использованием стандарта Ajax, особенно HTTP POST,. Код на стороне сервера для этого Ajax -вызова находится в "серверном" пакете (" server " package) данного приложения GWT. Этот код выполняется в контейнере сервлета или сервера приложений Java EE (так как мы на стороне сервера, это - Java -код, в то время как код, выполняемый в браузере, - на JavaScript) и именно здесь действия пользователя в браузере встраиваются в бизнес-логику, а DPL в Berkeley DB Java Edition используется для хранения объектов. вызова сгенерированного и управляемого GWT

Реализация RemoteService метода save():

Реализация RemoteService метода save(): 
...
public void createUser(UserDTO pUserDTO) {
    //transform the presentation layer object into a conceptual object
    User wUser = new User();
    wUser.setUserName(pUserDTO.getUserName());
    wUser.setInjury( pUserDTO.getInjury());
    UserService userService = new UserService();
    userService.createUser(wUser);
}
... 

Модельные объекты (Model objects) - это классы бизнес-данных, которые реализуют аспекты управления данными приложения в базе данных. Программист, использующий EJB, может в первом приближении определить UserService как stateless session bean.

Сам по себе класс BaseService не работает с какой-либо логикой. Этот класс управляется с транзакционным состоянием определенной задачи по одному или нескольким объектам в базе данных. Чтобы добавить логику бизнес-процесса сервису, это приложение (его разрабочик) должно расширить класс BaseService. В нашем примере класс UserService будет функционировать в этой роли и управляться со всем доступом к сущности User, обеспечивая реализации для методов, таких как createUser (), saveUser () и getUser ().

Эта реализация размещена в пакете на стороне сервера данного проекта. Она вызывает бизнес-сервис UserService., а модель POJO с аннотациями DPL будет храниться в базе данных Oracle Berkeley DB Java Edition. Вспомните, что эта база данных - это просто набор файлов, размещенных в файловой системе сервера, к которой есть доступ у контейнера сервлета Web -приложения. Именно UserService реализует бизнес-логику для конкретного экземпляра. В нашем примере теперь нужно трансформировать объект UserDTO в объект User

Проверенные подходы проектирования требуют, чтобы в приложении объекты DTO были отделены от бизнес-объектов благодаря уровням (layering) и абстрагированию. Бизнес-сервисы не должны знать о классах DTO, они должны взаимодействовать только с концептуальными моделями объектов. Эти объекты хранятся в базе данных Berkeley DB Java Edition. Классы бизнес-сервисов отвечают за управление концептуальных моделей объектов в хранилище данных. Для соотношения этого с EJB, UserService подобна stateless session bean.

Ниже приведен метод UserService. createUser ():

... 
public User createUser( User pUser ) throws DatabaseException, Exception{
        
        UserAccessor wUserAccessor = new UserAccessor();
        
        //check mandatory fields
        if ( pUser.getFirstName().equals("") //
                pUser.getLastName().equals("") //
                pUser.getUserName().equals("") ){
            throw new Exception("Missing mandatory fields");
        }
        
        
        open( false, wUserAccessor);
    
        // Start a transaction.
        startTransaction();
    
        // Put it in the store. Note that this causes our secondary key
        // to be automatically updated for us.
        try {
            
            wUserAccessor.userByUserName.put( pUser );
            
            // Commit the transaction. The data is now safely written to the
            // store.
            commit();
            
        } catch (DatabaseException dbe) {
            try {
                System.out.println("Error creating a user");
            } catch (Exception willNeverOccur) {
            }
            txn.abort();
            throw dbe;
        } catch (Exception e) {
            txn.abort();
            e.printStackTrace();
        }
        
        return pUser;
    }
...

Этот метод использует унаследованные методы open () и startTransaction (), чтобы установить и использовать Berkeley DB Java Edition как базу данных (aka сущность хранилище), а затем стартует транзакцию. Это разделение (функций) помогает разработчикам не делать ошибок при установке соединений с Berkeley DB Java Edition и позднее транзакций в процессе. Класс UserAccessor class ответственен за установку различных средств доступа интерфейса DPL в Berkeley DB Java Edition,. Ниже приведено содержание класса UserAccessor: особенно индексов, для доступа к данным. Этот класс инкапсулирует индексы, используемые позднее в данном коде для создания, изменения и уничтожения объектов в базе данных Berkeley DB Java Edition

UserAccessor: 
...
public class UserAccessor extends DefaultAccessor {
    public PrimaryIndex<String, User> userByUserName;
    public UserAccessor() {}
    public void init() throws DatabaseException{
        userByUserName = entityStore.getPrimaryIndex( String.class, User.class );
    }
}
...

С установкой этих средств доступа, слой бизнес-сервисов упрощается и согласуется. Задача создания и управления индексами выделена как единое изолированное целое, которое не будет взаимодействовать с вашей бизнес-логикой. Вот пример, в котором используется индекс для выборки экземпляра User по имени.

wUser = wUserAccessor.userByUserName.get(pUser.getUserName());

Иначе, для выборки пользовательского объекта без использования этих методов средств (accessor methods), этот код должен был бы выглядеть примерно так:

PrimaryIndex<String, User> userByUserName; 
userByUserName = entityStore.getPrimaryIndex(String.class, User.class);
User wUser = userByUserName.get();

Преимущество этого метода должны быть очевидны: код намного проще в первом случае. Этот подход проектирования надо рассматривать при комбинировании GWT и Berkeley DB Java Edition.