Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate запросы и маппинг


Автор: admin82 17.6.2007, 16:51
Сижу уже неделю. Задание следующее:

Есть три таблицы COMPANY, EMPLOYEE, ADDRESS
Отношения между таблицами следующие:

COMPANY  *-* EMPLOYEE

EMPLOYEE  1-1 ADDRESS

COMPANY  1 - * ADDRESS

Вывести в output информацию из базы данных по компаниям + их адреса + количество работников в компаниях.
Например:
COMPANY_NAME       ADRESS1        QUANTITY OF EMPLOYEES
                     ADDRESS2
                     …

Написал такие маппинги: 

Код

<?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="com.ss.entity.Address" table="Address">
        <id name="idAddress" column="idAddress">
            <generator class="increment"/>
        </id>
        <property name="city" column = "city"/>
        <property name="street" column = "street"/>
        <property name="build" column = "build"/>
    </class>    
</hibernate-mapping>


Код

<?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="com.ss.entity.Company" table="Company">
        <id name="idCompany" column="idCompany">
            <generator class="increment"/>
        </id>
        <property name="name" column="name"/>
    
        <set name="addresses" table="Address" cascade="all" inverse = "true">
            <key column="idCompany" />
            <one-to-many  class="com.epam.ss.Address"/>
        </set>
        
        <set name = "employees" table = "Company_Employee_Link" cascade = "save-update" lazy="true" >
        <key column = "idCompany"/>
        <many-to-many class = "com.ss.entity.Employee" column = "idEmployee"/>
        </set>
        
    </class>
</hibernate-mapping>



<?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="com.ss.entity.Employee" table="Employee">
        <id name="idEmployee" column="idEmployee">
            <generator class="increment"/>
        </id>
        <property name="firstName" column="firstname"/>
        <property name="lastName" column="lastname"/>
        <property name="age" column="age"/>        

        <component name="address" 
        class="com.ss.entity.Address">
        <property name= "build" />
        <property name= "street" />
        <property name= "city" />
        </component>
        </class>
</hibernate-mapping>

Для связи EMPLOYEE  1-1 ADDRESS я использую component, а не one-to-one, т.к. тогда, по-моему, нельзя было бы правильно работать со связью COMPANY  1 - * ADDRESS (ведь тогда ключи формируются зависимыми). Правильно ли это? Меня смущает, что тогда информация типа street, city, build хранится и в таблице Address, и в таблице Employee (для тех адресов, которые соотнесены с работником). А те адреса, которые соотнесены только  с компанией, хранятся только  в таблице Address. 

Ну а дальше вообще темно. таблицы я позаполнял из DatabaseManagerSwing просто вводя SQL. А как надо бы правильно сохранять создаваемые объекты из программы,? Код 
            
Код


   Company comp = new Company("Pupkin & Co");
        Address addr = new Address("Minsk", "Skoriny",81);
        sess.save(addr);
        Set setAddr = new HashSet();
        setAddr.add(addr);
        comp.setAddresses(setAddr);
        sess.save(comp);


создает записи в таблицах Address и Company, но в поле idCompany таблице Address ничего не пишется, т.е. связь то не работает!!!.

И такое непонимание у меня во всем! Уж не говорю о самом задании -- как вывести такую информацию? 



Автор: DimW 21.6.2007, 11:40
Цитата(admin82 @  17.6.2007,  16:51 Найти цитируемый пост)
но в поле idCompany таблице Address ничего не пишется, т.е. связь то не работает!!!.


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


Цитата(admin82 @  17.6.2007,  16:51 Найти цитируемый пост)
как вывести такую информацию?


селектом в ResaltSet.

и совсем не понятно как организована связь COMPANY  *-* EMPLOYEE, таких ключей в природе не существует.
единственный вариан через третью таблицу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)