powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / [ ORM ] Альтернатива Hibernate
22 сообщений из 47, страница 2 из 2
[ ORM ] Альтернатива Hibernate
    #37567831
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ActiveJDBC - лайтвейт реализация паттерна ActiveRecord, http://code.google.com/p/activejdbc.

Если кратко в чем преимущества и недостатки - очень легко ложится когда структура базы не очень сложная и контролируется разработчиком, так как основан на convention over configuration, нет никаких персистенс контекстов, сессий и т.д. настройка минимальна. поддерживает кэшинг, асооциации, лейзи лоадинг, листенеры и кучу всего. Очень легко тестируется
Из минусов - есть зависимости от классов фреймворка(не true POJO), что как по мне не так уж и критично. Главный минус - на этапе сборки необходима инструментация, но она легко настраивается, но так как классы инструментированы работа при дебаге и из IDE немного затруднена, работаем над этим.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37567834
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А и еще не поддерживает JPA, кому-то возможно это будет существенным минусом.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37567861
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123про topLink немного критики, когда сам искал:

Они все в той или иной степени глючные. Говорят topLink быстрее чем хибернейт на оракле. Правда?
про скорость не слышал. Очень уж трудный критерий для данного класса ПО.
Ложек дёгтя больше про него слышал чем про другие.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37567864
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczГоворят topLink быстрее чем хибернейт на оракле. Правда?нет
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37567963
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, забыл ник!

> http://code.google.com/p/activejdbc.
> Главный минус - на этапе сборки
> необходима инструментация, но она легко настраивается, но так как классы
> инструментированы работа при дебаге и из IDE немного затруднена,
> работаем над этим.

Ну по мне, так инструментация при загрузке (хибер) точно не лучше :)
А как это применимо к разработке JavaEE?

1. Вообще возможна работа внутри Stateless?

2. Запуск клиента на машине разработчика обычно происходит из eclipse
без мавена, т.е. инструментации на клиенте не будет. Но все запросы
только с AS, т.е. там будет. Это нормально?

3. Что будет, если я пытаюсь получить LAZY на клиенте, т.е. вне сессии?
Можно ли вешать некий листинер, который при этом будет вызывать
обращение к AS и получение необходимых данных?
Пример - есть "клиент" у него "адрес" у адреса "улица", "город", "ПО",
ещё всякая фигня. Хочется, с одной стороны, обойтись загрузкой адреса, с
другой- получать что нужно без проблем.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568023
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут немного другая инструментация, хибер создает прокси, тогда как ActiveJDBC, добавляет методы в основном статические прямо в класс модели, поэтому когда открываешь из эклипса файл мождели - то он пишет что сорс нот фаунд, но если открыть класс модели через ctrl_shift+r то его сорсы ты увидишь, брейкпоинты тоже ставить, в общем недостаток, но не критичный. Жить можно.

Зачем добавляются статические методы? Чтобы можно было делать вещи вроде Person.findById() и т.д..

1. Вообще возможна работа внутри Stateless? - не совсем понял, поясните плиз.

2. Запуск клиента на машине разработчика обычно происходит из eclipse
без мавена, т.е. инструментации на клиенте не будет. Но все запросы
только с AS, т.е. там будет. Это нормально? - Опять не совсем понял, обьясняю, что клиент что сервер будут зависеть от какой-то либы с классами модели, эта либа получается при сборке после фазы инструментации, таким образом она видна будет что там, что там, я ответил на вопрос?

3. Что будет, если я пытаюсь получить LAZY на клиенте, т.е. вне сессии?
Можно ли вешать некий листинер, который при этом будет вызывать
обращение к AS и получение необходимых данных?
Пример - есть "клиент" у него "адрес" у адреса "улица", "город", "ПО",
ещё всякая фигня. Хочется, с одной стороны, обойтись загрузкой адреса, с
другой- получать что нужно без проблем.----------- AJ вообще не закрывает сессию, на пальцах как это работает - ты создаешь фильтр, в начале реквеста вызываешь DB.getConnection() и она автоматом ложится в ThreadLocal, при любом запросе любого метода модели, коннекшн берется из ThreadLocal transparent. В конце запроса коннекшн из тредлокал изымается.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568032
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
брейкпоинты ставить можно, а то я немного сумбурно описал. Просто когда дебажишь когда доходит до класса модели - показывает типа сорс файла нет, а на самом деле ты его можешь открыть и смотреть че там внутри.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568095
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, забыл ник!

> 1. Вообще возможна работа внутри Stateless? - не совсем понял, поясните
> плиз.

Я просто не знаю- может есть какие-то камни подводные.

> я ответил на вопрос?

Примерно.

> AJ вообще не закрывает сессию,

Ещё раз. На AS получил объект. Передал его через RMI на клиента. Там
попросил данные, которые LAZY. Что будет?
EJB2, насколько я знаю древности, дозапросит данные, но оракловые админы
хотели запиннать того, кто это придумал.
EJB3 просто пошлёт нафиг.

Что сделается тут?

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568161
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕщё раз. На AS получил объект. Передал его через RMI на клиента. Там
попросил данные, которые LAZY. Что будет?
EJB2, насколько я знаю древности, дозапросит данные, но оракловые админы
хотели запиннать того, кто это придумал.
EJB3 просто пошлёт нафиг.

Что сделается тут?


Понял, класс будет искать коннекшн в треадлокале и обломится. Вообще очень интересный поинт, раньше рассматривал только в контексте веб-приложений, надо будет подумать.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568210
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraЕщё раз. На AS получил объект. Передал его через RMI на клиента. Там
попросил данные, которые LAZY. Что будет?Давайте начнем с того, что мы никак не можем передать через RMI клиенту неинициализированное поле. Просто напросто потому, что оно несериализуемо. А если бы оно и было сериализуемо, то клиент все равно не смог бы его десериализовать, ибо на месте неинициализированных полей стоят прокси, чей байт-код формируется в runtime-е.
Как быть в этом случае? А в этом случае надо вспоминать про J2EE паттерны, в частности про Data Transfer Object.

забыл никПонял, класс будет искать коннекшн в треадлокале и обломится. Вообще очень интересный поинт, раньше рассматривал только в контексте веб-приложений, надо будет подумать.Это неправда. Какой коннекшн? В каком треад-локале? На клиенте нет ни того, ни другого.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568217
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никПонял, класс будет искать коннекшн в треадлокале и обломится. Вообще очень интересный поинт, раньше рассматривал только в контексте веб-приложений, надо будет подумать.Это неправда. Какой коннекшн? В каком треад-локале? На клиенте нет ни того, ни другого.[/quot]

так именно потому и обломится
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568222
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomGKS_SamaraЕщё раз. На AS получил объект. Передал его через RMI на клиента. Там
попросил данные, которые LAZY. Что будет?Давайте начнем с того, что мы никак не можем передать через RMI клиенту неинициализированное поле. Просто напросто потому, что оно несериализуемо. А если бы оно и было сериализуемо, то клиент все равно не смог бы его десериализовать, ибо на месте неинициализированных полей стоят прокси, чей байт-код формируется в runtime-е.
Как быть в этом случае? А в этом случае надо вспоминать про J2EE паттерны, в частности про Data Transfer Object.


Мы не про Хибернейт сейчас кстати.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568251
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никМы не про Хибернейт сейчас кстати.Ок, а про что? Вы думаете другие ORM-фреймфорки как-то принципиально иначе работают с LAZY-зависимостями? Что бы она инициализировалась на лету, прозрачно для программиста, всегда необходимо иметь на ее месте некую заглушку. При нормальном проектировании, клиент ничего про эти заглушки знать не должен.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568256
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никтак именно потому и обломитсяГде именно обломится? И что за ThreadLocal и Connection вы имеете ввиду?
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568280
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomзабыл никМы не про Хибернейт сейчас кстати.Ок, а про что? Вы думаете другие ORM-фреймфорки как-то принципиально иначе работают с LAZY-зависимостями? Что бы она инициализировалась на лету, прозрачно для программиста, всегда необходимо иметь на ее месте некую заглушку. При нормальном проектировании, клиент ничего про эти заглушки знать не должен.

Естественно нужна заглушка, но не факт что это будет прокси да еще с байт-кодом сгенеренным в рантайм. В данном случае это наследник AbstractList, который на каждый метод проверяет инициализирован ли он и если нет, то пытается получить коннекшн и загрузить себя.
А про что речь, как бы изначально нужно знать прежде чем писать ответы:) Выше по топику посмотри
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568297
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЕстественно нужна заглушка, но не факт что это будет прокси да еще с байт-кодом сгенеренным в рантайм. В данном случае это наследник AbstractList, который на каждый метод проверяет инициализирован ли он и если нет, то пытается получить коннекшн и загрузить себя.Ну во-первых, то, что вы описали, это уже и есть прокси.
Во-вторых, вы привели случай One-To-Many, когда у нас есть неинициализированный список. А вот что делать, если у меня *-To-One отношение? Тут уже надо наследоваться от типа конкретного члена класса, и это вам ответ на вопрос, почему без байт-кода в рантайме не обойтись.
В-третьих, если даже такую хренотень удалось сериализовать и десериализовать, то клиент получает опасный код, который может завалить его приложение, что является грубейшей ошибкой проектирования.
Вывод: на удаленного клиента никогда и ни при каких условиях не передаются неинициализированные сущности.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568323
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomзабыл никЕстественно нужна заглушка, но не факт что это будет прокси да еще с байт-кодом сгенеренным в рантайм. В данном случае это наследник AbstractList, который на каждый метод проверяет инициализирован ли он и если нет, то пытается получить коннекшн и загрузить себя.Ну во-первых, то, что вы описали, это уже и есть прокси.
Во-вторых, вы привели случай One-To-Many, когда у нас есть неинициализированный список. А вот что делать, если у меня *-To-One отношение? Тут уже надо наследоваться от типа конкретного члена класса, и это вам ответ на вопрос, почему без байт-кода в рантайме не обойтись.
В-третьих, если даже такую хренотень удалось сериализовать и десериализовать, то клиент получает опасный код, который может завалить его приложение, что является грубейшей ошибкой проектирования.
Вывод: на удаленного клиента никогда и ни при каких условиях не передаются неинициализированные сущности.

Насчет прокси я не так выразился, да естественно это будет паттерн прокси, я неправильно вас понял, я думал имеются ввиду сгенерированные классы Proxy, которые находятся в java.lang.reflect. Ну это так, к слову. Я согласен что нужна заглушка, сойдемся на этом. А вот насчет - авторесли у меня *-To-One отношение? Тут уже надо наследоваться от типа конкретного члена класса, и это вам ответ на вопрос, почему без байт-кода в рантайме не обойтись.


Зачем наследоваться? можно на момент инициализации орм узнать реальный тип parent, сохранить его в метаданных, в момент вызова getParent() проверять isInitialized, и если нет - то запрашивать у БД и возвращать приведя к типу сохраненному в метаданных. Зачем рантайм байт код?
авторВ-третьих, если даже такую хренотень удалось сериализовать и десериализовать, то клиент получает опасный код, который может завалить его приложение, что является грубейшей ошибкой проектирования.
Вывод: на удаленного клиента никогда и ни при каких условиях не передаются неинициализированные сущности.

Тут не спорю. Просто интересно стало.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568341
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЗачем наследоваться? можно на момент инициализации орм узнать реальный тип parent, сохранить его в метаданных, в момент вызова getParent() проверять isInitialized, и если нет - то запрашивать у БД и возвращать приведя к типу сохраненному в метаданных. Зачем рантайм байт код?
Ок, вот у нас ентити:
Код: java
1.
2.
3.
4.
5.
6.
public class Employee implements Serializable {
    private Long id;
    private Department department;
    public Long getId() { return id; }
    public Department getDepartment() { return department; }
}


И вот у нас ентити:
Код: java
1.
2.
3.
4.
5.
6.
public class Department implements Serializable {
    private Long id;
    private String name;
    public Long getId() { return id; }
    public String getName() { return name; }
}


Департамент загружается лениво.
Теперь задача такова - нам надо, когда инстанс Employee окажется на клиенте, чтобы вызов метода getDepartment() привел к подгрузке департамента (допустим, что это возможно). Как нам этого добиться?
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568345
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да давайте для просто вообще выкинем удаленного клиента, все происходит в рамках одной JVM.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568402
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да легко.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
public abstract class Model implements Externalizable {
	private MetaModel metaModelLocal;
    private Map<Class, Model> cachedParents = new HashMap<Class, Model>();
    private Map<Class, List<Model>> cachedChildren = new HashMap<Class, List<Model>>();
    
    public <T extends Model> T parent(Class<T> parentClass) {

        T cachedParent = (T)cachedParents.get(parentClass);
        if(cachedParent != null){
            return cachedParent;
        }
        MetaModel parentMM = Registry.instance().getMetaModel(parentClass);
        String parentTable = parentMM.getTableName();

        BelongsToAssociation ass = (BelongsToAssociation)getMetaModelLocal().getAssociationForTarget(parentTable, BelongsToAssociation.class);
        BelongsToPolymorphicAssociation assP = (BelongsToPolymorphicAssociation)getMetaModelLocal()
                .getAssociationForTarget(parentTable, BelongsToPolymorphicAssociation.class);

        String fkValue;
        String fkName;
        if(ass != null){
            fkValue = getString(ass.getFkName());
            fkName = ass.getFkName();
        }else if(assP != null){
            fkValue = getString("parent_id");            
            fkName = "parent_id";

            if(!assP.getTypeLabel().equals(getString("parent_type"))){
                throw new IllegalArgumentException("Wrong parent: '" + parentClass + "'. Actual parent type label of this record is: '" + getString("parent_type") + "'");
            }
        }else{
            throw new IllegalArgumentException("there is no association with table: " + parentTable);
        }

        if(fkValue == null){
            throw new OrphanRecordException("Attribute:  "  + fkName + " is null, cannot determine parent. Child record: " + this);
        }
        String parentIdName = parentMM.getIdName();
        String query = getMetaModelLocal().getDialect().selectStarParametrized(parentTable, parentIdName);

        T parent;
        if(parentMM.cached()){
            parent = (T)QueryCache.instance().getItem(parentTable, query, new Object[]{fkValue});
            if(parent != null){
                return parent;
            }
        }

        List<Map> results = new DB(getMetaModelLocal().getDbName()).findAll(query, Integer.parseInt(fkValue));
        //expect only one result here
        if (results.size() == 0) { //ths could be covered by referential integrity constraint
            return null;
        } else {
            try {
                parent = parentClass.newInstance();
                parent.hydrate(results.get(0));
                if(parentMM.cached()){
                    QueryCache.instance().addItem(parentTable, query, new Object[]{fkValue}, parent);
                }
                return parent;
            } catch (Exception e) {
                throw new InitException(e.getMessage(), e);
            }
        }
    }
}

@BelongsTo(parent = Department.class, foreignKeyName = "department_id")
public class Employee extends Model {
    private Long id;
    private Department department;
    public Long getId() { return id; }
    public Department getDepartment() { return getParent(Department.class); }
}


public class Department extends Model {
    private Long id;
    private String name;
    public Long getId() { return id; }
    public String getName() { return name; }
    
}



Ну естественно это для одного JVM, для разных нет смысла, соглашусь.
...
Рейтинг: 0 / 0
[ ORM ] Альтернатива Hibernate
    #37568427
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, это никуда не годиться. Два главных минуса:
1) Вы лишили пользователя вашей библиотеки возможности реализовывать наследование. То есть, вот с таким случаем ваша реализация не справиться:
Код: java
1.
2.
3.
public class Employee { }
public class OfficeEmployee extends Employee { }
public class WorkshopEmployee extends Employee { }


2) Второй минус - вы намертво привязали сущности к вашей библиотеке. Ежели вдруг решили перейти на другой ORM - пиши пропало.

Возвращаясь к варианту с Employee и Department, я вижу 3 варианта решения:
1) Оборачиваем Employee в прокси через bytecode instrumentation - на лету экстендим прокси от Employee. оверрайдим getDepartment().
2) Оборачиваем Department в прокси через bytecode instrumentation - на лету экстендим прокси от Department, оверрайдим все геттеры/сеттеры, чтобы при обращении к неинициализированному объекту, они вытаскивали его из базы. Так работает хибер.
3) Вариант без игр с байт-кодом. При сборке проекта прогоняем наши сущности через какую-нибудь утилиту, которая обернет их в прокси. Так, например, работает JiBX (хоть это и не ORM, а средство генерации классов из WSDL/XSD, но идея та же). На выходе имеем джарник, в котором вроде бы лежат наши классы, но по факту там еще куча всего нового добавлено. Главная беда такого подхода - неудобно распространять. То есть высылать такую либу какому-нибудь стороннему клиенту - это, все равно, что плюнуть ему в лицо - вместо тупой работы с get/set, ему придется еще париться об отлове всяких интересных исключений
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
[ ORM ] Альтернатива Hibernate
    #38527785
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / [ ORM ] Альтернатива Hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]