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

Поиск:

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


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


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

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



пример по hibernate

там первое поле id и в xml оно определяется так:
Код


<id name="id" type="string"
unsaved-value="null">
<column name="id" sql-type="char(32)"
not-null="true"/>
<generator class="uuid.hex"/>
</id>



У меня в базе поле userId(в базе самой как user_id), тип Integer

Пытался вместо id писать выше userId, но он ругается. Обязательно чтоли первое поле должно быть id? 


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


Летатель
***


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

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



Цитата(Bulat @  12.7.2006,  17:54 Найти цитируемый пост)
Обязательно чтоли первое поле должно быть id?  

Конечно, не обязательно. В твоем случае должно быть так:
Код

<id name="userId" type="string" unsaved-value="null">
    <column name="user_id" sql-type="char(32)" not-null="true"/>
    <generator class="uuid.hex"/>
</id>

или, например, так:
Код

<id name="userId" column="user_id" type="java.lang.String">
    <generator class="uuid.hex"></generator>
</id>

А что именно говорит Hibernate в плане ругани? 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 13.7.2006, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(tux @  13.7.2006,  02:00 Найти цитируемый пост)
А что именно говорит Hibernate в плане ругани?


Да нет, все понятно, сейчас это уже не важно smile 


P.S. Модераторы??? Не пойму почему моя тема перешла в J2EE, концептуально, Hibernate предназначается для работы с БД, или его кроме как в web-приложении невозможно использовать? Вроде бы я не видел такого ограничения. smile  


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


Летатель
***


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

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



Цитата(Bulat @  13.7.2006,  08:18 Найти цитируемый пост)
Да нет, все понятно, сейчас это уже не важно

Так а чего же спрашивал?

Цитата(Bulat @  13.7.2006,  08:18 Найти цитируемый пост)
Не пойму почему моя тема перешла в J2EE, концептуально, Hibernate предназначается для работы с БД, или его кроме как в web-приложении невозможно использовать?

Темы по Hibernate в J2EE - это традиция. smile 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 13.7.2006, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(tux @  13.7.2006,  03:41 Найти цитируемый пост)
Так а чего же спрашивал?

Конкретно после твоего поста стало понятно smile 
 


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


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


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

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



Хотел бы еще уточнить один момент, так как в примере все очень стандартно. в базе у меня поля типа mediumint(8) unsigned NOT NULL default '0', так вот в xml-файле достаточно написать mediumint(8) или надо полностью? 


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


Летатель
***


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

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



Достаточно одно типа поля, то есть mediumint(8). Но, вообще говоря, sql-type в маппинге нужно писать только если ты хочешь изменить дефолтное соответствие между типом данных Hibernate и типом данных СУБД. У меня такой необходимости ни разу не возникало, Hibernate сам разбирается smile 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 13.7.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



еще один вопрос: в примере написано

Код

import java.util.List;
import net.sf.hibernate.Hibernate;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import Product;


я подключил библиотеки 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 может там еще какие джары надо поключить?
  

Это сообщение отредактировал(а) Bulat - 13.7.2006, 09:40


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


Летатель
***


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

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



В версии 3.0 пакеты поменялись с net.sf.hibernate на org.hibernate. Пример у тебя видимо для 2.1 или ниже. Если поменять имена пакетов и заголовки файлов маппингов, то все должно работать (теоретически). 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 13.7.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



tux
И еще моментик при поиске данных используется метод:

Код

Configuration cfg = new Configuration().addClass(Product.class);

SessionFactory sf = cfg.buildSessionFactory();

// открываем Session
Session sess = sf.openSession();

// поиск, результат в list
List list = sess.find(query, name, Hibernate.STRING);


А именно на метод List list = sess.find(query, name, Hibernate.STRING);

Я так понимаю тут тоже надо что-то другое использовать? 


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


Летатель
***


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

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



Цитата(Bulat @  13.7.2006,  15:08 Найти цитируемый пост)
Я так понимаю тут тоже надо что-то другое использовать?  

Угу, метод find() - deprecated. Выглядеть теперь будет примерно так:
Код

List list = session.createQuery(query).setString("name", name).list();
 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 13.7.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



tux, и давай добьем все это запросом, там значит идет такой:
select product from product in class test.hibernate.Product where product.name=:name
Вот подчеркнутое место мне не совсем понятно.... smile  


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


Летатель
***


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

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



Первый раз вижу такой синтаксис, будет время, попробую. Можно сделать проще:
Код

from test.hibernate.Product p where p.name=:name

Заметь, это полный текст запроса, select не обязателен. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 13.7.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



tux, очень сильно ругается:

структура проекта:
Код

src
    Interface
        HorseHerald
            LoginsData.java
            LoginsData.hbm.xml
        Properties
            hibernate.properties
        WorkClasses
            FindByUserId


класс контейнер:
Код

package Interface.HorseHerald;

import java.sql.Timestamp;

public class LoginsData {
    private Integer userId;
    private Integer recordId;
    private Integer loginId;
    private String name;
    private String pin;
    private String realm;
    private Double balance;
    private Double limit;
    private Integer tariffId;
    private Integer parameterId;
    private Timestamp birthDate;
    private Timestamp expirationDate;
    private Timestamp operationDate;
    private String operationUser;

    public LoginsData() {

    }

    public Integer getUserId() {
        return userId;
    }

    public Integer getRecordId() {
        return recordId;
    }

    public Integer getLoginId() {
        return loginId;
    }

    public String getName() {
        return name;
    }

    public String getPin() {
        return pin;
    }

    public String getRealm() {
        return realm;
    }

    public Double getBalance() {
        return balance;
    }

    public Double getLimit() {
        return limit;
    }

    public Integer getTariffId() {
        return tariffId;
    }

    public Integer getParameterId() {
        return parameterId;
    }

    public Timestamp getBirthDate() {
        return birthDate;
    }

    public Timestamp getExpirationDate() {
        return expirationDate;
    }

    public Timestamp getOperationDate() {
        return operationDate;
    }

    public String getOperationUser() {
        return operationUser;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public void setRecordId(Integer recordId) {
        this.recordId = recordId;
    }

    public void setLoginId(Integer loginId) {
        this.loginId = loginId;
    }

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

    public void setPin(String pin) {
        this.pin = pin;
    }

    public void setRealm(String realm) {
        this.realm = realm;
    }

    public void setBalance(Double balance) {
        this.balance = balance;
    }

    public void setLimit(Double limit) {
        this.limit = limit;
    }

    public void setTariffId(Integer tariffId) {
        this.tariffId = tariffId;
    }

    public void setParameterId(Integer parameterId) {
        this.parameterId = parameterId;
    }

    public void setBirthDate(Timestamp birthDate) {
        this.birthDate = birthDate;
    }

    public void setExpirationDate(Timestamp expirationDate) {
        this.expirationDate = expirationDate;
    }

    public void setOperationDate(Timestamp operationDate) {
        this.operationDate = operationDate;
    }

    public void setOperationUser(String operationUser) {
        this.operationUser = operationUser;
    }
    
}


hibernate.properties: 
Код

hibernate.connection.username=//login
hibernate.connection.password=//pass
hibernate.connection.url=//host:port/db  и т.п.
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQLDialect


Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="LoginsData"
    table="Logins">

        <id name="userId" type="Integer"
            unsaved-value="null">
            <column name="user_id" sql-type="mediumint(8)"
            not-null="true"/>
            <generator class="uuid.hex"/>
        </id>

        <property name="recordId">
            <column name="record_id" sql-type="int(10)"
            not-null="true"/>
        </property>

        <property name="loginId">
            <column name="login_id" sql-type="int(10)"
            not-null="true"/>
        </property>

        <property name="name">
            <column name="name" sql-type="varchar(60)"
            not-null="true"/>
        </property>

        <property name="pin">
            <column name="pin" sql-type="varchar(16)"
            not-null="true"/>
        </property>

        <property name="realm">
            <column name="realm" sql-type="varchar(8)"
            not-null="true"/>
        </property>

        <property name="balance">
            <column name="balance" sql-type="double(16,10)"
            not-null="true"/>
        </property>

        <property name="limit">
            <column name="limit" sql-type="double(16,10)"
            not-null="true"/>
        </property>

        <property name="tariffId">
            <column name="tariff_id" sql-type="int(10)"
            not-null="true"/>
        </property>

        <property name="parameterId">
            <column name="parameter_id" sql-type="int(10)"
            not-null="true"/>
        </property>

        <property name="birthDate">
            <column name="birth_date" sql-type="datetime"
            not-null="true"/>
        </property>

        <property name="expirationDate">
            <column name="expiration_date" sql-type="datetime"
            not-null="true"/>
        </property>

        <property name="operationDate">
            <column name="operation_date" sql-type="datetime"
            not-null="true"/>
        </property>

        <property name="operationUser">
            <column name="operation_user" sql-type="varchar(32)"
            not-null="true"/>
        </property>

    </class>
</hibernate-mapping>


Код

package Interface.WorkClasses;

import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import Interface.HorseHerald.LoginsData;


public class FindUserByLogin {

    public static void main(String[] args) throws Exception {
// запрос
    String query =
    "FROM test.hibernate.LoginsData p where p.user_id=:name";

// что ищем?
    Integer userId = 28308;
    //String name = args[0];
    String name = userId.toString();
// инициализация
    Configuration cfg = new Configuration().addClass(LoginsData.class);

    SessionFactory sf = cfg.buildSessionFactory();

// открываем Session
    Session sess = sf.openSession();

// поиск, результат в list
    List list = sess.createQuery(query).setString("name", name).list();

    if (list.size() == 0) {
        System.out.println("Нет юзеров с кодом " + name);
        System.exit(0);
    }

    LoginsData p = (LoginsData) list.get(0);
    sess.close();
    System.out.println("Найден юзер: " + p);
    }
}



вот что он мне пишет
Код

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: Error reading resource: Interface/HorseHerald/LoginsData.hbm.xml
    at org.hibernate.cfg.Configuration.addClass(Configuration.java:471)
    at Interface.WorkClasses.FindUserByLogin.main(FindUserByLogin.java:29)
    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)
Caused by: org.hibernate.MappingException: class LoginsData not found while looking for property: recordId
    at org.hibernate.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:81)
    at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.java:275)
    at org.hibernate.cfg.HbmBinder.createProperty(HbmBinder.java:1841)
    at org.hibernate.cfg.HbmBinder.createClassProperties(HbmBinder.java:1827)
    at org.hibernate.cfg.HbmBinder.createClassProperties(HbmBinder.java:1728)
    at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:318)
    at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:236)
    at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:152)
    at org.hibernate.cfg.Configuration.add(Configuration.java:362)
    at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:400)
    at org.hibernate.cfg.Configuration.addClass(Configuration.java:468)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: LoginsData
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:164)
    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:108)
    at org.hibernate.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:77)
    ... 16 more


надо вообщем найти юзера по полю user_id(в базе) - userId(соотв. в кодах), где userId=28308 smile  smile  smile 
  

Это сообщение отредактировал(а) Bulat - 13.7.2006, 12:37


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


Летатель
***


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

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



Ну дык он файл с маппингом найти не может. Положи его (LoginsData.hbm.xml) в CLASS-PATH вместе с классом, тогда увидим следующую ошибку. smile
Вообще рекомендовал бы конфигурировать Hibernate используя hibernate.cfg.xml, это просто удобнее. Выглядеть он должен примерно так:
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="show_sql">true</property>
        <property name="use_outer_join">false</property>
        <property name="connection.username">user</property>
        <property name="connection.password">password</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.autocommit">false</property>
        <property name="connection.url">jdbc:postgresql://localhost/database</property>

        <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"/>
    </session-factory>
</hibernate-configuration>

hibernate.cfg.xml надо положить в корень CLASS-PATH, hibernate.properties оттуда убрать. Ну и все маппинги должны лежать по какому-то пути в CLASS-PATH, у тебя, например, в Interface/HorseHerald.

Конфигурирование тогда совсем простое:
Код

Configuration cfg = new Configuration();
cfg.configure();
SessionFactory factory = cfg.buildSessionFactory();
 
PM MAIL Skype GTalk Jabber YIM   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1797 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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