Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate, xml-файл 
V
    Опции темы
Bulat
Дата 13.7.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



tux, сконфигурировал по-твоему и :

Код

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.MappingException: Resource: ru/esstu/entrant/orm/hibernate/AdmittanceContainer.hbm.xml not found
    at org.hibernate.cfg.Configuration.addResource(Configuration.java:447)
    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1263)
    at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1235)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1217)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1184)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1112)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1098)
    at Interface.HorseHerald.FindUserByLogin.main(FindUserByLogin.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)


Теперь уж без тебя как без рук smile  


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tux
Дата 14.7.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



А ты куда AdmittanceContainer.hbm.xml положил? И он у тебя именно так называется? Он должен лежать в каталоге ru/esstu/entrant/orm/hibernate относительно корня CLASS-PATH. То есть если у тебя веб-приложение, то, например, в WEB-INF/classes/ru/esstu и т.д. Если не в веб-приложении, то вместе с твоими откомпилированными классами. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 14.7.2006, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



tux, я смотрел выше указанный пример, там к сожалению нет ничего про AdmittanceContainer.hbm.xml и т.п. и конфигурируется там по другому, давай линьки на более подробное описание smile (мне лень из похожих тем ссылки рассматривать smile )

 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tux
Дата 14.7.2006, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Не может там по-другому конфигурироваться. Все маппинги Hibernate ищет в ресурсах в текущем CLASS-PATH по тому пути, который ты укажешь в hibernate.cfg.xml или в том же пакете, где и классы если конфигурируешь используя hibernate.properties. 

Насчет линков... У меня один линк - родная документация по Hibernate. Больше ничего не видел, может быть и есть. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 17.7.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



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"/>


нашел несколько линков, но английском, к сожалению по ка не очень smile  


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tux
Дата 18.7.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Ну давай поподробнее. Просто закину пример с двумя классами, поменяй на свою задачу. 

Значится так. Есть два класса и две таблицы, представляющие каталоги и файлы в этих каталогах. 

Класс Folder:
Код

public class Folder implements Serializable {

    private int id;
    private String name;
    private int type;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
}

Класс File:
Код

public class File implements Serializable {

    private long id;
    private String name;
    private String title;
    private Blob content;
    private String contentType;
    private Folder folder;
    public Blob getContent() {
        return content;
    }
    public void setContent(Blob content) {
        this.content = content;
    }
    public String getContentType() {
        return contentType;
    }
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    public Folder getFolder() {
        return folder;
    }
    public void setFolder(Folder folder) {
        this.folder = folder;
    }
    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 getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

Маппинг для класса File (File.hbm.xml):
Код

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="File" table="n_file">

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

        <property name="name" type="java.lang.String" update="true" insert="true"
            column="file_name" not-null="true" />
            
        <property name="title" type="java.lang.String" update="true" insert="true"
            column="file_title" not-null="true" />
            
        <property name="content" type="java.sql.Blob" update="true" insert="true"
            column="file_content" not-null="true" />
            
        <property name="contentType" type="java.lang.String" update="true" insert="true"
            column="file_content_type" not-null="true" />
            
        <many-to-one name="folder"
            class="org.breezeproject.notes.entity.Folder" cascade="none"
            outer-join="auto" update="true" insert="true" lazy="proxy">
            <column name="folder_id" />
        </many-to-one>
    </class>
</hibernate-mapping>

Маппинг для класса Folder (Folder.hbm.xml):
Код

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="Folder" table="n_folder">

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

        <property name="name" type="java.lang.String" update="true" insert="true"
            column="folder_name" not-null="true" />
            
        <property name="type" type="int" update="true" insert="true"
            column="folder_type" not-null="true" />
            
    </class>
</hibernate-mapping>

Что есть интересного в маппингах. В тэгах class опредено соответствие между классом (name) и таблицей (table). Тэг id соответствует primary key в таблице. Вообще во всех тэгах свойства name - принадлежность класса (имя класса, атрибут и т.п.). В идентификаторах column - поле таблицы, которое primary key. Можно делать идентификаторы, состоящие из нескольких полей, за такими подробностями - в документацию. 

Тэг property определяет свойство класса и соответствующее поле в таблице. 

Наконец, тэг many-to-one дает возможность выбрать целый объект по идентификатору. Здщесь определяется атрибут, которому присвоится выбранное значение (name), класс этого объекта (class), на и тэг column определяет идентификатор, по которому будет получен объект. Такой вид связи характерен для foreign key. Например в данном случае для каждого файла получаем как его атрибут и каталог, причем ничего особенного для этого делать не надо, Hibernate сам получит и куда надо подставит.

Ну вот, будут вопросы, спрашивай.  

Это сообщение отредактировал(а) tux - 18.7.2006, 13:22
PM MAIL Skype GTalk Jabber YIM   Вверх
SamDark
Дата 25.7.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: нет
Всего: 38



tux
Встала задача работать с MySQL. Выбрал hibernate. Почти разобрался.
Для описания маппинга использую XML. Аннотации как-то не по душе пришлись.

Первым делом опробовал примеры. Всё нормально заработало.
Далее выделил часть кода, повторяющуюся многократно и попытался вынести в отдельный утиль-класс...

Тут и возникли проблемы:
Код

package src.util;

import java.util.ArrayList;

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

import src.data.Price;

public class HibernateManager {
    private static HibernateManager instance;
    private static Configuration cfg;
    private static SessionFactory sf;
    
    public static HibernateManager getInstance(){
        if (instance == null) instance = new HibernateManager();
          return instance;
    }
    
    private HibernateManager(){
        cfg.configure();
        cfg.addClass(Price.class);
        sf = cfg.buildSessionFactory();
    }
    
    public void store(Object obj){
        Session sess = sf.openSession();
        Transaction t = sess.beginTransaction();
        sess.save(obj);
        t.commit();
        sess.close();
    }
    
    public ArrayList select(String query){
        Session sess = sf.openSession();
        ArrayList list = new ArrayList(sess.createQuery(query).list());
        sess.close();
        return list;
    }
}


1. Как избавится от прямого перечисления требуемых классов? т.е. не пользовать cfg.addClass(Price.class);
2. Как по-хорошему возвращать результат работы select(), ну и соотв. передавть объекты в store()? 


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
tux
Дата 25.7.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(SamDark @  25.7.2006,  17:20 Найти цитируемый пост)
1. Как избавится от прямого перечисления требуемых классов? т.е. не пользовать cfg.addClass(Price.class);

Можно избавиться только если перечислять в конфигурационном hibernate.cfg.xml маппинги классов. В общем либо то либо другое. Пример hibernate.cfg.xml есть выше в этой теме.

Цитата(SamDark @  25.7.2006,  17:20 Найти цитируемый пост)
2. Как по-хорошему возвращать результат работы select(), ну и соотв. передавть объекты в store()?  

Во-первых, зачем у тебя делается вот это?
Код

ArrayList list = new ArrayList(sess.createQuery(query).list());

Можно ведь просто вернуть результат работы методы list(). И, во-вторых, а чем сейчас код не устраивает? 
PM MAIL Skype GTalk Jabber YIM   Вверх
SamDark
Дата 25.7.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: нет
Всего: 38



tux
Для начала огромное спасибо за помощь!

1. Понял. Буду пользовать маппинги из XML.
2. После того, как разобрался с маппингами код устроил вполне.

Ещё одна проблема с маппингом:
Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="src.data">
    <class
        name="Price"
        table="prices"
    >
        <meta attribute="sync-DAO">false</meta>
        <id
            name="id"
            type="string"
            column="id"
            length="32"
        >
            <generator class="uuid.hex"/>
        </id>

        <property
            name="priceCategory"
            column="price_category"
            type="string"
            length="32"
        />
        <property
            name="price"
            column="price"
            type="float"
            unique="false"
        />
    </class>    
</hibernate-mapping>


Код

Hibernate: insert into prices (price_category, price, id) values (?, ?, ?)
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at src.util.HibernateManager.store(HibernateManager.java:33)
    at src.test.TPrice.insert(TPrice.java:20)
    at src.test.TPrice.main(TPrice.java:10)
Caused by: java.sql.BatchUpdateException: Duplicate entry '3.230' for key 1
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:647)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
    ... 10 more


! Duplicate entry '3.230' for key 1 !
т.е. вставка одинковых данных не проходит, хотя нет ограничений в таблице, да и в маппинге (вроде) тоже. 


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
tux
Дата 25.7.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(SamDark @  25.7.2006,  18:08 Найти цитируемый пост)
т.е. вставка одинковых данных не проходит, хотя нет ограничений в таблице, да и в маппинге (вроде) тоже.  

Это исключение драйвер JDBC выкидывает, надо на уровне БД смотреть. 
PM MAIL Skype GTalk Jabber YIM   Вверх
SamDark
Дата 25.7.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: нет
Всего: 38



tux
"Вроде" оказалось именно "вроде". Спасибо за подсказку. 


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
new
Дата 26.7.2006, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Хочу задать вопрос по поводу размещения hibernate.hbm.xml и map-файлов:
У меня это все лежит в /WEB-INF/classes и все работает на ура.
Хочу положить конфиги напрмер в /WEB-INF/conf/hibernate.Это возможно ?  smile 
Еще хотелось бы прояснить ситуацию с CLASSPATH в веб-приложениях:
У каждого веб-приложения свой CLASSPATH.Существует контекстный (так вроде называется) CLASSPATH для веб-пиложения (/WEB-INF/lib).
Как изменить CLASSPATH приложения ? (к примеру добавить туда /WEB-INF/conf/hibernate) или так не получится ? 
PM MAIL   Вверх
tux
Дата 26.7.2006, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(new @  26.7.2006,  06:11 Найти цитируемый пост)
Хочу положить конфиги напрмер в /WEB-INF/conf/hibernate.Это возможно ? 

Все возможно, у Hibernate очень гибкое конфигурирование и использование CLASS-PATH - лишь дефолтный способ, правда, очень удобный. Вместо метода configure(), который пытается найти в ресурсах конфигурационный файл hibernate.cfg.xml можно использовать:
  • configure(org.w3c.dom.Document document), конфигурирующий Hibernate, используя модель документа, которую можно сформировать программно и конфигурировать свое приложение вообще любым способом
  • configure(File configFile), используя файл, находящийся в любом месте файловой системы
  • configure(String resource), использующий любой ресурс в CLASS-PATH
  • configure(URL url), использующий ресурс, находящийся по указанному URL, то есть конфигурация может находиться удаленно и даже формироваться динамически.
Как видишь, способы конфигурирования практически неограничены.

Что касается маппингов... Возможности их размещения более ограничены. В dtd атрибуты тэга mapping описаны так:
Код

<!ELEMENT mapping EMPTY>
<!ATTLIST mapping resource CDATA #IMPLIED>
<!ATTLIST mapping file CDATA #IMPLIED>
<!ATTLIST mapping jar CDATA #IMPLIED>
<!ATTLIST mapping package CDATA #IMPLIED>
<!ATTLIST mapping class CDATA #IMPLIED>

То есть возможностей тоже много.

Цитата(new @  26.7.2006,  06:11 Найти цитируемый пост)
Как изменить CLASSPATH приложения ? (к примеру добавить туда /WEB-INF/conf/hibernate) или так не получится ?  

Средствами сервера приложения или веб-контейнера не получится, но можно реализовать собственный загрузчик классов, тогда все возможно. 
PM MAIL Skype GTalk Jabber YIM   Вверх
baph
  Дата 1.11.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 24.10.2009

Репутация: нет
Всего: нет



Что за хрень все всё знают и не делятся!! Совсем как этот смайл  smile . Я же не прошу мне писать проект работы с бд, я просто хочу понять почему не рабоет то,что я сделал и как написано в тюторах оно уже должно работать. Во первых ответьте пожалуйста так или не так должен выглядеть главный класс, вот код: 
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. Сама бд есть и проект приложения, но что-то не срастается и толком не работает. Вот моё мыло [email protected] или [email protected], может кто осмелиться сообщить свое, чтоб отправить файл проекта. 

Это сообщение отредактировал(а) baph - 1.11.2009, 13:19
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1084 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.