| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Hibernate |
| Автор: Bulat 12.7.2006, 12:54 | ||
| пример http://msk.nestor.minsk.by/kg/2005/32/kg53209.html там первое поле id и в xml оно определяется так:
У меня в базе поле userId(в базе самой как user_id), тип Integer Пытался вместо id писать выше userId, но он ругается. Обязательно чтоли первое поле должно быть id? |
| Автор: tux 13.7.2006, 02:00 | ||||
Конечно, не обязательно. В твоем случае должно быть так:
или, например, так:
А что именно говорит Hibernate в плане ругани? |
| Автор: Bulat 13.7.2006, 03:18 |
Да нет, все понятно, сейчас это уже не важно P.S. Модераторы??? Не пойму почему моя тема перешла в J2EE, концептуально, Hibernate предназначается для работы с БД, или его кроме как в web-приложении невозможно использовать? Вроде бы я не видел такого ограничения. |
| Автор: Bulat 13.7.2006, 04:09 |
Конкретно после твоего поста стало понятно |
| Автор: Bulat 13.7.2006, 07:29 |
| Хотел бы еще уточнить один момент, так как в примере все очень стандартно. в базе у меня поля типа mediumint(8) unsigned NOT NULL default '0', так вот в xml-файле достаточно написать mediumint(8) или надо полностью? |
| Автор: tux 13.7.2006, 08:00 |
| Достаточно одно типа поля, то есть mediumint(8). Но, вообще говоря, sql-type в маппинге нужно писать только если ты хочешь изменить дефолтное соответствие между типом данных Hibernate и типом данных СУБД. У меня такой необходимости ни разу не возникало, Hibernate сам разбирается |
| Автор: Bulat 13.7.2006, 09:39 | ||
еще один вопрос: в примере написано
я подключил библиотеки hibernate3.jar, hibernate3-src.jar, ant-1.6.3.jar, ant-antlr-1.6.3.jar, ant-junit-1.6.3.jar, ant-launcher-1.6.3.jar, antlr-2.7.5H3.jar, ant-swing-1.6.3.jar, asm.jar, asm-attrs.jar, c3p0-0.8.5.2.jar, cglib-2.1.jar, cleanimports.jar, commons-collections-2.1.1.jar, commons-logging-1.0.4.jar, concurrent-1.3.2.jar, connector.jar, dom4j-1.6.jar, ehcache-1.1.jar, jaas.jar, jacc-1_0-fr.jar, jaxen-1.1-beta-4.jar, jboss-cache.jar, jboss-common.jar, jboss-jmx.jar, jboss-system.jar, jdbc2_0-stdext.jar, jgroups-2.2.7.jar, jta.jar, junit-3.8.1.jar, log4j-1.2.9.jar, oscache-2.1.jar, proxool-0.8.3.jar, swarmcache-1.0rc2.jar, versioncheck.jar, xerces-2.6.2.jar, xml-apis.jar - две из корневика остальные из либа, как было написано, однако он ругается на import net.sf.hibernate.Hibernate; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.cfg.Configuration; у меня версия 3.0 может там еще какие джары надо поключить? |
| Автор: tux 13.7.2006, 09:48 |
| В версии 3.0 пакеты поменялись с net.sf.hibernate на org.hibernate. Пример у тебя видимо для 2.1 или ниже. Если поменять имена пакетов и заголовки файлов маппингов, то все должно работать (теоретически). |
| Автор: Bulat 13.7.2006, 10:08 | ||
| tux, И еще моментик при поиске данных используется метод:
А именно на метод List list = sess.find(query, name, Hibernate.STRING); Я так понимаю тут тоже надо что-то другое использовать? |
| Автор: tux 13.7.2006, 11:02 | ||
Угу, метод find() - deprecated. Выглядеть теперь будет примерно так:
|
| Автор: Bulat 13.7.2006, 11:28 |
| tux, и давай добьем все это запросом, там значит идет такой: select product from product in class test.hibernate.Product where product.name=:name Вот подчеркнутое место мне не совсем понятно.... |
| Автор: tux 13.7.2006, 11:40 | ||
Первый раз вижу такой синтаксис, будет время, попробую. Можно сделать проще:
Заметь, это полный текст запроса, select не обязателен. |
| Автор: Bulat 13.7.2006, 12:34 | ||||||||||||
| tux, очень сильно ругается: структура проекта:
класс контейнер:
hibernate.properties:
вот что он мне пишет
надо вообщем найти юзера по полю user_id(в базе) - userId(соотв. в кодах), где userId=28308 |
| Автор: tux 13.7.2006, 14:18 | ||||
| Ну дык он файл с маппингом найти не может. Положи его (LoginsData.hbm.xml) в CLASS-PATH вместе с классом, тогда увидим следующую ошибку. Вообще рекомендовал бы конфигурировать Hibernate используя hibernate.cfg.xml, это просто удобнее. Выглядеть он должен примерно так:
hibernate.cfg.xml надо положить в корень CLASS-PATH, hibernate.properties оттуда убрать. Ну и все маппинги должны лежать по какому-то пути в CLASS-PATH, у тебя, например, в Interface/HorseHerald. Конфигурирование тогда совсем простое:
|
| Автор: Bulat 13.7.2006, 17:11 | ||
tux, сконфигурировал по-твоему и :
Теперь уж без тебя как без рук |
| Автор: tux 14.7.2006, 01:34 |
| А ты куда AdmittanceContainer.hbm.xml положил? И он у тебя именно так называется? Он должен лежать в каталоге ru/esstu/entrant/orm/hibernate относительно корня CLASS-PATH. То есть если у тебя веб-приложение, то, например, в WEB-INF/classes/ru/esstu и т.д. Если не в веб-приложении, то вместе с твоими откомпилированными классами. |
| Автор: Bulat 14.7.2006, 07:35 |
| tux, я смотрел выше указанный пример, там к сожалению нет ничего про AdmittanceContainer.hbm.xml и т.п. и конфигурируется там по другому, давай линьки на более подробное описание |
| Автор: tux 14.7.2006, 07:40 |
| Не может там по-другому конфигурироваться. Все маппинги Hibernate ищет в ресурсах в текущем CLASS-PATH по тому пути, который ты укажешь в hibernate.cfg.xml или в том же пакете, где и классы если конфигурируешь используя hibernate.properties. Насчет линков... У меня один линк - родная документация по Hibernate. Больше ничего не видел, может быть и есть. |
| Автор: Bulat 17.7.2006, 12:58 |
| tux, а может про эти маппинг файлы мне поведать, поподробнее: <mapping resource="ru/esstu/entrant/orm/hibernate/AdmittanceContainer.hbm.xml"/> <mapping resource="ru/esstu/entrant/orm/hibernate/IdDocType.hbm.xml"/> <mapping resource="ru/esstu/entrant/orm/hibernate/PreliminaryExam.hbm.xml"/> нашел несколько линков, но английском, к сожалению по ка не очень |
| Автор: tux 18.7.2006, 12:12 | ||||||||
| Ну давай поподробнее. Просто закину пример с двумя классами, поменяй на свою задачу. Значится так. Есть два класса и две таблицы, представляющие каталоги и файлы в этих каталогах. Класс Folder:
Класс File:
Маппинг для класса File (File.hbm.xml):
Маппинг для класса Folder (Folder.hbm.xml):
Что есть интересного в маппингах. В тэгах class опредено соответствие между классом (name) и таблицей (table). Тэг id соответствует primary key в таблице. Вообще во всех тэгах свойства name - принадлежность класса (имя класса, атрибут и т.п.). В идентификаторах column - поле таблицы, которое primary key. Можно делать идентификаторы, состоящие из нескольких полей, за такими подробностями - в документацию. Тэг property определяет свойство класса и соответствующее поле в таблице. Наконец, тэг many-to-one дает возможность выбрать целый объект по идентификатору. Здщесь определяется атрибут, которому присвоится выбранное значение (name), класс этого объекта (class), на и тэг column определяет идентификатор, по которому будет получен объект. Такой вид связи характерен для foreign key. Например в данном случае для каждого файла получаем как его атрибут и каталог, причем ничего особенного для этого делать не надо, Hibernate сам получит и куда надо подставит. Ну вот, будут вопросы, спрашивай. |
| Автор: SamDark 25.7.2006, 12:20 | ||
| tux Встала задача работать с MySQL. Выбрал hibernate. Почти разобрался. Для описания маппинга использую XML. Аннотации как-то не по душе пришлись. Первым делом опробовал примеры. Всё нормально заработало. Далее выделил часть кода, повторяющуюся многократно и попытался вынести в отдельный утиль-класс... Тут и возникли проблемы:
1. Как избавится от прямого перечисления требуемых классов? т.е. не пользовать cfg.addClass(Price.class); 2. Как по-хорошему возвращать результат работы select(), ну и соотв. передавть объекты в store()? |
| Автор: tux 25.7.2006, 12:29 | ||||||
Можно избавиться только если перечислять в конфигурационном hibernate.cfg.xml маппинги классов. В общем либо то либо другое. Пример hibernate.cfg.xml есть выше в этой теме.
Во-первых, зачем у тебя делается вот это?
Можно ведь просто вернуть результат работы методы list(). И, во-вторых, а чем сейчас код не устраивает? |
| Автор: SamDark 25.7.2006, 13:08 | ||||
| tux Для начала огромное спасибо за помощь! 1. Понял. Буду пользовать маппинги из XML. 2. После того, как разобрался с маппингами код устроил вполне. Ещё одна проблема с маппингом:
! Duplicate entry '3.230' for key 1 ! т.е. вставка одинковых данных не проходит, хотя нет ограничений в таблице, да и в маппинге (вроде) тоже. |
| Автор: tux 25.7.2006, 13:17 | ||
Это исключение драйвер JDBC выкидывает, надо на уровне БД смотреть. |
| Автор: SamDark 25.7.2006, 13:27 |
| tux "Вроде" оказалось именно "вроде". Спасибо за подсказку. |
| Автор: new 26.7.2006, 01:11 |
| Хочу задать вопрос по поводу размещения hibernate.hbm.xml и map-файлов: У меня это все лежит в /WEB-INF/classes и все работает на ура. Хочу положить конфиги напрмер в /WEB-INF/conf/hibernate.Это возможно ? Еще хотелось бы прояснить ситуацию с CLASSPATH в веб-приложениях: У каждого веб-приложения свой CLASSPATH.Существует контекстный (так вроде называется) CLASSPATH для веб-пиложения (/WEB-INF/lib). Как изменить CLASSPATH приложения ? (к примеру добавить туда /WEB-INF/conf/hibernate) или так не получится ? |
| Автор: tux 26.7.2006, 03:29 | ||||||
Все возможно, у Hibernate очень гибкое конфигурирование и использование CLASS-PATH - лишь дефолтный способ, правда, очень удобный. Вместо метода http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cfg/Configuration.html#configure(), который пытается найти в ресурсах конфигурационный файл hibernate.cfg.xml можно использовать:
Что касается маппингов... Возможности их размещения более ограничены. В dtd атрибуты тэга mapping описаны так:
То есть возможностей тоже много.
Средствами сервера приложения или веб-контейнера не получится, но можно реализовать собственный загрузчик классов, тогда все возможно. |
| Автор: baph 1.11.2009, 13:14 |
| Что за хрень все всё знают и не делятся!! Совсем как этот смайл package net.sf.hibernate.examples.quickstart; //import org.hibernate.Hibernate; import org.hibernate.Transaction; import net.sf.hibernate.examples.quickstart.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.ServletException; import java.io.IOException; import static java.lang.Integer.parseInt; /** * Created by IntelliJ IDEA. */ public class Main extends HttpServlet { // HibernateUtil HUU = new HibernateUtil(); @Override protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { httpServletResponse.sendRedirect("myHtml.html"); } @Override protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { httpServletResponse.sendRedirect("myHtml.html"); // httpServletResponse.sendRedirect("Right.jsp"); HibernateUtil myf = new HibernateUtil(); Session session = (Session) HibernateUtil.currentSession(); //Transaction tx= session.beginTransaction(); Cat princess = new Cat(); princess.setName("Princess"); princess.setSex('F'); princess.setWeight(7.4f); // session.save(princess); //tx.commit(); HibernateUtil.closeSession(); } } И не делайте вид, что Вы этого не знаете или сообщение не видите, хотя из чувства общечеловеческой справедливости и презумции помощи, пожалуйста подскажите с как правильно сделать веб-проложение с hibernate и бд на Postgres 8. Сама бд есть и проект приложения, но что-то не срастается и толком не работает. Вот моё мыло tomass1@mail.ru или voinoftrue@mail.ru, может кто осмелиться сообщить свое, чтоб отправить файл проекта. |