singalen: (кричал я из последних сил)
[personal profile] singalen
Ввязался в авантюру - прочитать доклад о программировании для научных сотрудников младшего возраста. Темой выбрал, чтобы было популярно и интересно лично мне, Hibernate.

Конечно же, вся подготовка накрылась медным тазом. Быстро готовлюсь сегодня...

Сюда сохраняю черновик. Может, кто чего умное подскажет :) Считайте, что это "блики".

Речь


Вступаем в...


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

Главная идея такой борьбы - 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, о котором я слышал от [livejournal.com profile] 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

h

2/5/09 10:04 (UTC)
Posted by (Anonymous)
Профессионально с H дела не имел, но "щупал" его.
Могу сказать что есть ряд минусов:
- не получилось сходу настроить генератор PK на вариант programmatically generated guid
- вообще трудно подлезть и настроить sql кодогенератор под свои нужды. Как-то не очень он юзер френдли
- не нравится что приходится дублировать код sql - отдельно для БД, отдельно для hibernate. Хочется описывать структуру данных в одном месте в виде xml а потом из него генерировать и sql запросы на create/alter, и код для DAL.
- хочется auto migrations, подобное тому что есть в rails