(no subject)
3/12/08 14:24Ввязался в авантюру - прочитать доклад о программировании для научных сотрудников младшего возраста. Темой выбрал, чтобы было популярно и интересно лично мне, Hibernate.
Конечно же, вся подготовка накрылась медным тазом. Быстро готовлюсь сегодня...
Сюда сохраняю черновик. Может, кто чего умное подскажет :) Считайте, что это "блики".
Системы становятся всё сложнее. А поскольку объём кратковременной памяти программиста ограничен - всё больше усилий направляют на борьбу со сложностью.
Программисту и в собственном коде хватает вещей, которые нужно помнить и учитывать; не надо умножать их на особености и эффекты сервисной библиотеки. (Помним, что сложность программы растёт квадратично от размера).
Главная идея такой борьбы - low coupling, high cohesion, что означает: "держи в каждом программном модуле (библиотеке, классе, функции) только то, что необходимо для его ответственности; как только видишь отдельный "кластер связности" кода, выноси её в отдельный модуль; общайся с другими модулями через максимально простой интерфейс".
Большинству программ сейчас нужен такой внутренний сервис, как персистентция - способ создать объект, который проживёт дольше, чем будет работать программы. Грубо говоря, база данных.
* файлы;
* runtime API к нормализованным БД с таблицами, связями, ключами...
* SQL и паттерн "transaction script";
* API для SQL: паттерны Active Record, Table Gateway, Layer supertype, Record Set;
* И, наконец, Hibernate - где пользователь пишет только POJO, и (может быть, отдельно от кода) описание того, что в какие таблицы/поля сохранять. Ура, товарищи.
Примеры кода в слайдах
Примеры кода в слайдах
* полностью отвязали компиляционную зависимость от persistence layer;
* транзакции;
* lazy load;
* кэш минимизирует чтения-записи и объединяет их в пачки, уменьшая количество раундтрипов;
Session и примеры кода из "Getting started" (включить в раздаточный материал)
* HQL как "возврат в пампасы" - к SQL.
* Проблемы с запросами, которые не генерятся автоматически - вложенные SELECT-ы,
* Проблемы с производительностью и специальными случаями - см. gotchas.
Конечно, лучший persistence layer, о котором я слышал от
aleksijb - это виртуальная машина для Smalltalk, в которой все существующие объекты уже персистентны и любой вызов можно выполнить в транзакции (создав соответствующий атрибут).
Когда программисты на .NET будут вам говорить, что, мол, автогенерация кода для хранимых процедут MS SQL Server - это "удобно", не верьте ни единому слову. Они просто не видели хорошей персистенции.
В модели .NET ADO на 3 слоя больше, чем надо, а в Hibernate - всего на 1.
http://www.allapplabs.com/hibernate/introduction_to_hibernate.htm
http://hibernate.org/5.html#A2
PoEA
Содрать:
http://www.visualbuilder.com/java/hibernate/tutorial/
http://www.realsolve.co.uk/site/tech/hib-tip-pitfall-series.php
http://www.jroller.com/mycraziidaz/entry/hibernate_gotchas
Конечно же, вся подготовка накрылась медным тазом. Быстро готовлюсь сегодня...
Сюда сохраняю черновик. Может, кто чего умное подскажет :) Считайте, что это "блики".
Речь
Вступаем в...
Системы становятся всё сложнее. А поскольку объём кратковременной памяти программиста ограничен - всё больше усилий направляют на борьбу со сложностью.
Программисту и в собственном коде хватает вещей, которые нужно помнить и учитывать; не надо умножать их на особености и эффекты сервисной библиотеки. (Помним, что сложность программы растёт квадратично от размера).
Главная идея такой борьбы - low coupling, high cohesion, что означает: "держи в каждом программном модуле (библиотеке, классе, функции) только то, что необходимо для его ответственности; как только видишь отдельный "кластер связности" кода, выноси её в отдельный модуль; общайся с другими модулями через максимально простой интерфейс".
Большинству программ сейчас нужен такой внутренний сервис, как персистентция - способ создать объект, который проживёт дольше, чем будет работать программы. Грубо говоря, база данных.
История вопроса
* файлы;
* runtime API к нормализованным БД с таблицами, связями, ключами...
* SQL и паттерн "transaction script";
* API для SQL: паттерны Active Record, Table Gateway, Layer supertype, Record Set;
* И, наконец, Hibernate - где пользователь пишет только POJO, и (может быть, отдельно от кода) описание того, что в какие таблицы/поля сохранять. Ура, товарищи.
Примеры кода в слайдах
try {
Connection dbConnection = DriverManager.getConnection(url, ”loginName”, ”Password”);
}
catch(SQLException x) {
System.out.println("Couldn’t get connection!");
}
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery(
"SELECT COF_NAME, PRICE FROM COFFEES");
while (srs.next()) {
String name = srs.getString("COF_NAME");
float price = srs.getFloat("PRICE");
System.out.println(name + " " + price);
}
Cобственно введение в H
Примеры кода в слайдах
CREATE TABLE USERS(
USER_ID NUMERIC PRIMARY KEY,
FIRST_NAME CHAR(20),
LAST_NAME CHAR(20),
AGE NUMERIC,
EMAIL CHAR(40)
);
public class User {
private long userId = 0 ;
private String firstName = "";
private String lastName = "";
private int age = 0;
private String email = "";
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
}
Главные фичи
* полностью отвязали компиляционную зависимость от persistence layer;
* транзакции;
* lazy load;
* кэш минимизирует чтения-записи и объединяет их в пачки, уменьшая количество раундтрипов;
Обзор
Session и примеры кода из "Getting started" (включить в раздаточный материал)
Шутки и приколы
* HQL как "возврат в пампасы" - к SQL.
* Проблемы с запросами, которые не генерятся автоматически - вложенные SELECT-ы,
* Проблемы с производительностью и специальными случаями - см. gotchas.
Злоключение
Конечно, лучший persistence layer, о котором я слышал от
Когда программисты на .NET будут вам говорить, что, мол, автогенерация кода для хранимых процедут MS SQL Server - это "удобно", не верьте ни единому слову. Они просто не видели хорошей персистенции.
В модели .NET ADO на 3 слоя больше, чем надо, а в Hibernate - всего на 1.
Источники
:http://www.allapplabs.com/hibernate/introduction_to_hibernate.htm
http://hibernate.org/5.html#A2
PoEA
Содрать:
http://www.visualbuilder.com/java/hibernate/tutorial/
http://www.realsolve.co.uk/site/tech/hib-tip-pitfall-series.php
http://www.jroller.com/mycraziidaz/entry/hibernate_gotchas
Tags:
(no subject)
12/12/08 13:21 (UTC)http://community.livejournal.com/ru_java/749374.html?nc=19
http://fromapitosolution.blogspot.com/2008/12/criticism-of-java-persistence.html
h
2/5/09 10:04 (UTC)Могу сказать что есть ряд минусов:
- не получилось сходу настроить генератор PK на вариант programmatically generated guid
- вообще трудно подлезть и настроить sql кодогенератор под свои нужды. Как-то не очень он юзер френдли
- не нравится что приходится дублировать код sql - отдельно для БД, отдельно для hibernate. Хочется описывать структуру данных в одном месте в виде xml а потом из него генерировать и sql запросы на create/alter, и код для DAL.
- хочется auto migrations, подобное тому что есть в rails
(no subject)
3/5/09 08:18 (UTC)3. Описание объектов? Это не страшно. Это ещё микроскопическое дублирование, по сравнению с ручным persistence layer.
А когда подключаются вебсервисы, и надо транслировать серверный объект сначала в DTO, а потом в бизнес-объект на клиенте - вот это дублирование.
Или вот ADO.NET, с его процедурами и генерёнными классами - это же ужас-ужас.
4. Это полезность, но мелкая. Думаю, такое уже существует для Java, но это не область ответственности Hibernate.
Всё равно, миграцию данных в сложных случаях оно не потянет.