Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: Интересна ли вам эта тема
Да, интересно 14 100.00%
Нет, не интересно 0 0%
Голосовавшие: 14. Вы ещё не голосовали в этом опросе

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 21.09.2007, 10:35   #11
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 2. Слоистая архитектура, объектная модель.

Всем привет. Сразу прошу прощения за то, что промежуток между уроками такой большой -
к сожалению у меня абсолютно не хватает времени.

Итак, сегодня я расскажу про слоистую архитектуру приложений и рассмотрю доменную модель
нашего портала.

Для того чтобы понять что такое слоистая архитектура давайте рассмотрим пример -
у нас есть приложение, которое обращается к базе данных, производит с данными какие-либо
действия и отображает их пользователю через веб-интерфейс; пользователь производит
какие-либо действия с помошью веб интерфейса, отправляет данные на сервер,
там они обрабатываются и происходит обращение к базе данных и так далее.

Тут в нашей программе мы можем выделить 3 слоя:
1) Слой работы с базой данных, это самый низкий слой (Data Access Object Layer)
2) Слой бизнес логики, тут описана собственно логика работы приложения (Business Object Layer)
3) Слой пользовательского интерфейса, в нашем случае - веб-интерфейс (User Interface Layer)

Наши слои должны быть независимы друг от
друга: при необходимости замены, например, базы данных с MySQL на MSSQL нам придётся
переписать только 1-й слой, остальные должны работать так же без каких либо изменений.
Слой работы с базой данных ни сном ни духом не должен подозревать, что мы используем
в качестве интерфейса веб-интерфейс, или например - локальное приложение на машине клиента,
то-есть каждый слой должен знать только о тех слоях, с которыми он непосредственно работает.
В нашем случае - DAO знает только про BO слой; UI - тоже только про BO слой и только
сам BO слой знает и про DAO и про UI

Наши слои связаны друг с другом только посредством передаваемых между ними данных.
Какие же данные передаются между слоями?

DAO и BO общаются между собой посредством доменных объектов,
а BO и UI - посредсвом так называемых DTO - Data Transfer Objects.
(Есть и другие варианты - например в EJB 3 DTO не используются,
вместо них используються доменные объекты)

Далее мы рассмотрим и доменные объекты (так называемые Domain Objects или Entitiy Objects) и
Data Transfer Objects.

Теперь вы примерно представляете себе среднестатическую архитектуру копоративного JEE приложения.
Конечно, я рассказываю очень упрощённо, но суть остаётся неизменной.

Теперь пора перейти к нашему Комеди Клабу.

В нашем клубе будут юзеры которые будут писать истории.
1) Юзер может писать, читать, править и удалять свои истории
2) Юзер может определять для своих историй - побличные они или приватные
3) Юзер может добавлять других юзеров в свой список друзей а также удалять из него.
4) Юзер может читать публичные истории другого юзера
5) Юзер может читать приватные истории другого юзера, если тот включил его в свой список друзей
6) Юзер может оценивать публичныей истории другого юзера
7) Юзер может оценивать приветные истории другого юзера, если тот включил его в свой список друзей

Вот и все возможности нашего мини-портала

Выделим объекты которые мспользуются в нашем портале:

Это:
1) Юзер
2) История
3) Рейтинг истории

Это и есть наши доменные объекты!

Каждому из этих объектов будет соответсвовать таблица в базе данных.
Umen вне форума
Старый 21.09.2007, 10:37   #12
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 2

Теперь опишем взаимоотношения между объектами.

1) У Юзера есть логин, пароль, есть список своих историй, а также список друзей
2) У Истории есть юзер который является автором этой истории, название, текст истории,
а также список оценок которые история получила от других юзеров
3) Рейтинг истории содержит собственно историю, для которой он предназначен, оценку, и юзера, который её поставил.

Вот вам и доменная модель нашего приложеня.

А теперь перейдём собственно к программированию и опишем нашу доменную модель классами языка Java

Запускаем Eclipse Europa, выбираем File -> New -> Project... (2-й пункт сверху)
Далее выбираем WEB -> Dynamic Web Project -> Next -> Вводим имя нашего проекта в поле Project Name: ComedyClub
Если мы хотим изменить расположение проекта по умолчанию, то снимаем галочку с чекбокса Use Default поля Project Contents.
В поле Target Runtime выбираем Apache Tomcat 5.5, если там нет такого пункта - жмём new ->
выбираем Apache Tomcat 5.5 -> next -> В поле Tomcat installation directory выбираем путь, куда мы установили Tomcat,
у меня это c:\tomcat, остальные поля оставляем по умолчанию, далее жмём finish и уже теперь,
в поле Target Runtime выбираем Apache Tomcat 5.5. Всё, проект создан - в левой части экрана появилась
древовидная структура, описывающая наш проект.

Самое время создать наши доменные классы:
Открывем нашу древовидную струтуру, кликаем правой клавишей на папке Java Resources: src,
выбираем new->package. Мы создадим новый пакет в котором будут хранится наши классы. В поле Name
введём имя пакета: com.comedyclub.domain

Почему именно такое? На самом деле можно ввести любое имя (в рамках допустимого конечно),
но желательно, чтобы имя имело определённую структуру, здесь com.comedyclub - это обратное написание
comedyclub.com то есть, мы предпологаем что у нас есть веб-домен comedyclub.com, далее domain - это собственно место
гду будут хранится наши доменные объеткы (не путайте веб-домен и доменные объекты).

Если вы откроете в проводнике наш проект, зайдёте в папку src, вы увидите слудующую структуру папок:
com\comedyclub\domain

Структура имени нашего пакета описывает структуру папок внутри папки src нашего проекта.

Достаточно важно иметь правильную структуру пакетов, так как от этого зависит
будет ли приложение иметь логичную структуру либо будет просто свалкой классов.

Далее на нашем пакете кликаем правой клавишей и выбираем new -> class в поле Name вводим User -> Finish

У нас создался шаблон для класса User

Аналогично создаём классы Story и Rating.

В тескт класса User пишем:


package com.comedyclub.domain;

public class User {

private Long id;
private String name;
private String password;

public User() {}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

}

Обратите внимание на структуру нашего класса -
у нас есть 3 private поля и публичные геттеры и сеттеры для них. Такая структура это не моя прихоть,
а требование спецификации JEE для структуры подобного рода классов (Бинов). Ещё мы тут имеем дефолтный конструктор.
Также обратите внимание - в каждом доменном (да и в DTO тоже) объекте у нас будет поле id, фактически это уникальный ключ
объекта, его можно сравнить с первичным ключом таблицы в базе данных.

Перейдём к классу Story:

package com.comedyclub.domain;

public class Story {

private Long id;
private User user;
private String title;
private String content;
private boolean isPublic;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public boolean getIsPublic() {
return isPublic;
}

public void setIsPublic(boolean isPublic) {
this.isPublic = isPublic;
}

}
Umen вне форума
Старый 21.09.2007, 10:39   #13
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 2.

Обратите внимение - тут мы добавили поле типа User - созданного перед этим класса.

Теперь вернёмся к классу User и добавим в него список историй -

...........
private Set<Story> stories = new HashSet<Story> ();
...........
public Set<Story> getStories() {
return stories;
}

public void setStories(Set<Story> stories) {
this.stories = stories;
}

public void addStory(Story story) {
this.getStories().add(story);
story.setUser(this);
}

тут мы уже имеем множество, поэтому к геттеру и сеттеру мы добавим возможность добавлять историю
(В принципе мы могли этого не делать, а использовать getStories().add(Story story) напрямую)

Если у вас Set и HashSet станут подчёркнутыми красным - это значит что эклипс не может определить,
что это за классы, для этого нужно импортировать их с помошью зарезервированног слова import:

package com.comedyclub.domain;

import java.util.HashSet;
import java.util.Set;

public class User {
.................


также мы можем автоматически импортировать классы, для этого установим курсор на подчёркнутый красным класс
и нажмём Ctrl+Shift+M и эклипс предложит нам выбрать какой из нескольких доступных ему классов нужно имортировать.

Также добавим сюда список друзей:
..............
private Set<User> friends = new HashSet<User> ();

...............
public Set<User> getFriends() {
return friends;
}

public void setFriends(Set<User> friends) {
this.friends = friends;
}

public void addFriend(User friend) {
this.getFriends().add(friend);
}
....................

Мы мспользуем Set так как нам неважен порядок внутри списка, а также мы не допускаем дублирования элементов в нём
(иначе нам нкжно использовать List)

Далее, в класс Rating запишем следующее:

package com.comedyclub.domain;

public class Rating {

private Long id;
private Integer rate;
private User user;
private Story story;

public Rating() {}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public Integer getRate() {
return rate;
}

public void setRate(Integer rate) {
this.rate = rate;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public Story getStory() {
return story;
}

public void setStory(Story story) {
this.story = story;
}

}

Вернёмся к классу Story и добавим в него список оценок:

private Set<Rating> ratings = new HashSet<Rating> ();

public Set<Rating> getRatings() {
return ratings;
}

public void setRatings(Set<Rating> ratings) {
this.ratings = ratings;
}

public void addRating(Rating rating) {
this.ratings.add(rating);
rating.setStory(this);
}


Вот и всё! В принципе не помешало бы сериализовать наши объекты (переопределить для них методы toString, equals, hashCode),
однако нас пока и так устроит (не будем засорять чистую доменную модель деталями сериализации, тем более, что
в нашем случае всё будет прекрасно работать и без этого)

На сегодня всё. Работу с hibernate рассмотрим на следующем уроке, так как этот уже слишком разросся.
Про Data Transfer Objects также в одном из следующих уроков.
Umen вне форума
Старый 30.09.2007, 23:03   #14
Фея
Новичок
Джуниор
 
Регистрация: 30.09.2007
Сообщений: 2
По умолчанию

Большое спасибо автору, за эту тему, но хочется продолжения. В частности меня интересует работа с Bean компонентами.
Фея вне форума
Старый 29.10.2007, 07:43   #15
razrus
Новичок
Джуниор
 
Аватар для razrus
 
Регистрация: 29.10.2007
Сообщений: 2
По умолчанию

у мня траблы со скачиванием библиотек, помогите плиз. лучше в личку пишите, дабы не засорять постами тему
Я не волшебник, я тока учусь :)
razrus вне форума
Старый 29.10.2007, 18:20   #16
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Привет всем, снова извиняюсь что не продолжаю статьи (пока).
Библиотеки можна скачать тут http://ifolder.ru/3918642
Umen вне форума
Старый 03.11.2007, 18:23   #17
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 3. Работа с Hibernate

Здравствуйте все. По количеству голосов и количеству просмотров темы вижу, что она интересна!
Итак продолжим. Сегодня у нас на очереди Hibernate.

Как вы знаете Hibernate - это ORM (Object Relational Mapping) Framework.
Это означает, что он конвертирует объекты базы данных в объекты доменной
модели (что такое доменные объекты - см. выше).

Дя того чтобы рассмотреть работу с фремворком создадим новый проект в эклипсе и
назовём его SimpleHibernate.

------------- Подключение библиотек к проекту ------------------
Перейдём в домашнюю папку нашего приложения, создаём папку lib и копируем туда
следующие библиотеки:

antlr-2.7.6.jar
asm.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-lang-2.3.jar
commons-logging-1.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
jta-1.0.1B.jar
mysql-connector-java-3.1.14.jar

Возвращаемся в еклипс, мышкой выделяем наш проект и жмём F5,
либо выбераем "refersh" из контекстного меню.
Видим что в проекте появилась наша папочка lib.
раскрывем её и выбираем все библиотеки, далее на них
правой клавишей -> Build path -> Add to Build path
Всё теперь наши библиотеки подключены к нашему проекту.
-----------------------------------------------------------------

Смысл нашего простого вспомогательного приложения будет такой:
У нас есть офис и компьютеры в нём. Нам нужно создать доменную модель
которая описывает отношения между этими объектами
и сохранить её в базу.

Создадим доменную модель.

Офис.
У офиса есть имя компании к которой он относится, количество рабочих,
и компьютеры в нём.

Создаём новый пакет - com.simpleHibernate.domain
в нём создаём новый класс - Office

в класс добавляем поля:

private Long id;

private String companyName;

private Integer workersCount;

private Set<Workstation> workstations = new HashSet<Workstation>();

(Workstation у нас пока не определено)

Теперь сгенерируем геттеры и сеттеры для наших полей:
помещяем курсор мыши сразу после полей,
жмём правой клавишей мышки и выбираем source->Generate Getters and Setters
В появившемся окне ставим галочки возле всех методов и жмём ok - геттеры и сеттеры
вставились автоматичаски!

Как я говорил ранее - доменные объекты в принципе нужно сериализовывать
(хотя работать будет и без этого). Давайте сериализуем наш класс Office.
для этого в заголовке класса пропишем implements Serializable:

public class Office implements Serializable {

добавим поле serialVersionUID с любым значением:

static final long serialVersionUID = 1234234231434234234L;

без него эклипс будет выводить предупреждение.
Далее перекроем методы equals, hashCode и toString.
Необходимо сказать что в этих методах (кроме toString) не стоит использовать
поле id,а также поля-коллекции.
В этих методах мы воспользуемся библиотекой commons-lang от apache,
а именно методами EqualsBuilder, HashCodeBuilder, ToStringBuilder:


public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o == this) {
return true;
}
if (!(o instanceof Office)) {
return false;
}

Office office = (Office) o;

return new EqualsBuilder().
append(this.companyName, office.companyName).
append(this.workersCount, office.workersCount).isEquals();
}

public int hashCode() {
return new HashCodeBuilder(17, 37).
append(this.companyName).
append(this.workersCount).toHashCod e();
}

public String toString() {
return new ToStringBuilder(this).
append(this.id).
append(this.companyName).
append(this.workersCount).toString( );
}


Я не буду детально останавливаться не сериализиции, так как это отдельная тема.


Аналогично создаём класс Workstation c полями:

private Long id;
private Office office;
private String ip;
private String rootAdminLogin;

Создаём геттеры и сеттеры для них, и сериализуем класс:

public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o == this) {
return true;
}
if (!(o instanceof Office)) {
return false;
}

Workstation workstation = (Workstation) o;

return new EqualsBuilder().
append(this.ip, workstation.ip).
append(this.rootAdminLogin, workstation.rootAdminLogin).isEqual s();
}

public int hashCode() {
return new HashCodeBuilder(7, 37).
append(this.ip).
append(this.rootAdminLogin).toHashC ode();
}

public String toString() {
return new ToStringBuilder(this).
append(this.id).
append(this.ip).
append(this.rootAdminLogin).toStrin g();
}

Доменная модель готова.
Umen вне форума
Старый 03.11.2007, 18:26   #18
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 3. Работа с Hibernate

Теперь приступаем к интеграции с hibernate.
Для того чтобы hibernate знал как правильно конвертировать
объекты наших классов в записи базы данных и назад необходимо
для каждого класса доменной модели написать конфигурационный файл,
он должен называться так же как и класс и иметь расширение hbm.xml
У нас будет 2 таких файла - Office.hbm.xml и Workstation.hbm.xml

Рассмотрим Office.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.simpleHibernate.domain.Of fice">
<id name="id" column="id" type="long">
<generator class="identity" />
</id>

<property name="CompanyName" />
<property name="WorkersCount" />

<set inverse="true" name="Workstations" cascade="all" lazy="false">
<key column="officeId" />
<one-to-many class="com.simpleHibernate.domain.W orkstation" />
</set>
</class>
</hibernate-mapping>


тут <?xml... и <!DOCTYPE... просто заголовки.

в разделе <hibernate-mapping> и происходит описание маппинга

<class name="com.simpleHibernate.domain.Of fice"> - указываем какой класс маппим

внутри мы указываем какие поля класса и как мы будем маппить.
В самом простом случае достаточно описать вот так <property name="PropertyName" />
так можно описывать поля простых типов, которые не являются ключевыми и Hibernate сам разберётся как
с нами работать. Для первичного ключа используется запись такого типа:

<id name="id" column="id" type="long">
<generator class="identity" />
</id>

тут мы указываем что первичным ключём будет колонка id которая будет отображатся на
наше поле id

Самое сложное - это описывать отношения между таблицами.

<set inverse="true" name="Workstations" cascade="all" lazy="false">
<key column="officeId" />
<one-to-many class="com.simpleHibernate.domain.W orkstation" />
</set>

тут мы описали отношение один ко многим, то есть что у офиса есть много компов.
В базе это будет сконверитровано таким образом, что в таблице Workstation появится
колонка officeId. Однако чтобы это заработало нужно правильно описать Workstation.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.simpleHibernate.domain.Wo rkstation">
<id name="id" column="id" type="long">
<generator class="identity" />
</id>

<property name="Ip" />
<property name="RootAdminLogin" />

<many-to-one class="com.simpleHibernate.domain.O ffice" name="Office" not-null="true">
<column name="officeId" />
</many-to-one>
</class>
</hibernate-mapping>

Всё, конфигурация закончена, детально вдаваться в синтаксис конфигурационных файлов я пока не буду.
Идём дальше - добавим тестовый класс, чтобы протестировать нашу модель.
Создадим пакет com.simpleHibernate.test и в этом пакете создадим класс HibernateTest следующего содержания:
Umen вне форума
Старый 03.11.2007, 18:28   #19
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 3. Работа с Hibernate

package com.simpleHibernate.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.simpleHibernate.domain.Office;
import com.simpleHibernate.domain.Workstat ion;

public class HibernateTest {
public static void main(String[] args) {
Configuration configuration = new Configuration().
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect ").
setProperty("hibernate.connection.d river_class", "com.mysql.jdbc.Driver").
setProperty("hibernate.connection.u rl", "jdbc:mysql://localhost/hibernateTest").
setProperty("hibernate.connection.u sername", "hibernateTest").
setProperty("hibernate.connection.p assword", "hibernateTest").
setProperty("hibernate.show_sql", "true").
setProperty("hibernate.hbm2ddl.auto ", "create");

configuration.addClass(Office.class );
configuration.addClass(Workstation. class);

SessionFactory sessionFactory = configuration.buildSessionFactory() ;

Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();

saveOfficeWithWorkstations(session) ;
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
System.out.println(e);
} finally {
session.close();
}
}

private static void saveOfficeWithWorkstations(Session session) {
Office office = new Office();
office.setCompanyName("Microsoft");
office.setWorkersCount(100000);

Set<Workstation> workstations = new HashSet<Workstation>();

Workstation workstation1 = new Workstation();
workstation1.setOffice(office);
workstation1.setIp("192.168.1.99");
workstation1.setRootAdminLogin("roo tAdminLogin");
workstations.add(workstation1);

Workstation workstation2 = new Workstation();
workstation2.setOffice(office);
workstation2.setIp("192.168.1.100") ;
workstation2.setRootAdminLogin("roo tAdminLogin2");
workstations.add(workstation2);

office.setWorkstations(workstations );

session.save(office);
}

}

чтобы это всё заработало нам необходимо в MySQL с помощью heidiSQL добавить базу hibernateTest
и пользователя hibernateTest с паролем hibernateTest который, имеет права на работу с базой hibernateTest

теперь запускаем: Run - > Run As -> Java Application
смотрим на консольку там должно отображатся много текста. Если всё ок то в конце
будет выписано

Hibernate: insert into Office (CompanyName, WorkersCount) values (?, ?)
Hibernate: insert into Workstation (Ip, RootAdminLogin, officeId) values (?, ?, ?)
Hibernate: insert into Workstation (Ip, RootAdminLogin, officeId) values (?, ?, ?)

открываем heidiSQL смотрим в базу hibernateTest - там создались две таблицы office и workstation
и в них есть записи.

Ура всё заработало!

Теперь немного проясню код:

Configuration configuration = new Configuration().
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect ").
setProperty("hibernate.connection.d river_class", "com.mysql.jdbc.Driver").
setProperty("hibernate.connection.u rl", "jdbc:mysql://localhost/hibernateTest").
setProperty("hibernate.connection.u sername", "hibernateTest").
setProperty("hibernate.connection.p assword", "hibernateTest").
setProperty("hibernate.show_sql", "true").
setProperty("hibernate.hbm2ddl.auto ", "create");

тут мы настраиваем наше соединение с базой.
строка setProperty("hibernate.hbm2ddl.auto ", "create") означает что таблицы будут каждый раз создаваться заново.

configuration.addClass(Office.class );
configuration.addClass(Workstation. class);

тут мы указываем какие классы должны быть отображены в базу.

SessionFactory sessionFactory = configuration.buildSessionFactory() ;

Session session = sessionFactory.openSession();
Transaction transaction = null;

все операции с базой выполняются в рамках сессии. каждая операция выполняется в транзакции.

try {
transaction = session.beginTransaction();

saveOfficeWithWorkstations(session) ;
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
System.out.println(e);
} finally {
session.close();
}

тут мы создаём новую транзакцию, выполняем операцию, и сохраняем транзакцию.
Если во время операции возникнет исключение, то транзакция не будет сохранена.
В конце всех операций закрываем сессию.
Umen вне форума
Старый 03.11.2007, 18:29   #20
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию Урок 3. работа с Hibernate

private static void saveOfficeWithWorkstations(Session session) {
Office office = new Office();
office.setCompanyName("Microsoft");
office.setWorkersCount(100000);

Set<Workstation> workstations = new HashSet<Workstation>();

Workstation workstation1 = new Workstation();
workstation1.setOffice(office);
workstation1.setIp("192.168.1.99");
workstation1.setRootAdminLogin("roo tAdminLogin");
workstations.add(workstation1);

Workstation workstation2 = new Workstation();
workstation2.setOffice(office);
workstation2.setIp("192.168.1.100") ;
workstation2.setRootAdminLogin("roo tAdminLogin2");
workstations.add(workstation2);

office.setWorkstations(workstations );

session.save(office);
}

собственно операция. Тут мы создаём новый офис и два компа, которые добавляем к офису
и сохраняем это всё в базу. Обратите внимание - мы сохраняем только офис, а все компы которые были добавлены
к нему сохраняются автоматически!

Я очень повехностно описал работу с Hibernate. но надеюсь что заинтерисовал вас и далее вы уже сами
сможете углубить свои знания например с помошью книги Beginning POJOS from novice to professional от Brian Sam-Bodden.

На сегодня всё. В следующий раз я расскажу про Spring
Umen вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер - Быстрый старт Ev3658 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 12 17.01.2023 22:16
Старт в ВЕБе AVer Свободное общение 5 29.03.2015 20:55
Старт в Java Artem Vitalievich Общие вопросы по Java, Java SE, Kotlin 1 03.07.2014 13:15
Ищу веб-програмиста для старт-апа Валентин Андреевич Фриланс 2 19.10.2011 10:25
Старт в Java for Mobile: Уроки [Smarik] Общие вопросы по Java, Java SE, Kotlin 6 14.07.2010 15:17