powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Хибернет, туды его в качель ...
7 сообщений из 7, страница 1 из 1
Хибернет, туды его в качель ...
    #33260171
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу! Не доделали его таки ... Куча багов. НО один достал таки.
Вобщем дело тако, есть некий класс (для простоты возьмем другой пример, более близкий к трудовому народу). Так, ордер типа. Тама 2 адреса - один, куды посылать, второй, кто платит. Соответвенно класс Order имеет (инкапсулирует по научному) 2 класса Address. Ну в hbm сию байду оПисываем через component типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
< class  >
<property>
...
<component name="куды"  class ="Address">
...
<component name="кто"  class ="Address">
</ class >

Но проблема в том, что и тот, и другой адресс лежат в одной таблице (базу менять низя!). Берем некий named query типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select 
id as {ord.id}
...
where_street as {ord.where.street}
...
who_street as {ord.who.street}
...
from crazy_table where ...
И усе на первой взгляд даже вроде работало (так как часто куды и кто совпадають). А выяснилось, что куды и кто совпадають ВСЕГДА, даже если в базе они разные. А почему? Да по тому что злобный хибер перелопачивет сие SQL-ное чудо в что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select 
id as id1_0_
...
where_street as street1_0_
...
who_street as street1_0_
...
from crazy_table where ...
Как не сложно заметить названия колонок в хибенетовском исполнении для куды и кого совпадають. Ну а кады результат на полку и начинаем мапировать, глюпий хибер натыкается на первую клонку с именем street1_0_ и пихает данные и туды и сюды. И не обойти сие никак. Я имеею ввиду красиво обойти. Не красивых обходов мульен, бум выбирать ...
...
Рейтинг: 0 / 0
Хибернет, туды его в качель ...
    #33260592
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrushok

Атец, а где сырцы?
...
Рейтинг: 0 / 0
Хибернет, туды его в качель ...
    #33261828
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот сырцы, детишки. Только тама никаких street нема, но кто не туп, разберетси

Типа hbm
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
<?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  package ="com.invitrogen.ds.model">

	< class  name="MatchRecord">
		<id name="id" type="long" >
			<generator  class ="assigned"/>
		</id>
		<property name="name" type="string" length="100"/>
		<property name="type" type="string" length="30"/> <!-- CONTENT_NAME -->
		<property name="sku" type="string" length="30"/>
		<property name="prognum" type="string" length="20"/>
		<property name="match_type" type="string" length="30"/> <!-- MATCHED CONTENT_NAME -->
		<component name="updated"  class ="MatchDatabaseRecord">
			<property name="geneid" type="long" insert="false" update="false"/>
			<property name="gi" type="long" insert="false" update="false"/>
			<property name="accession" type="string" length="20" insert="false" update="false"/>
			<property name="version" type="string" length="20" insert="false" update="false"/>
			<property name="p_gi" type="long" insert="false" update="false"/>
			<property name="p_accession" type="string" length="20" insert="false" update="false"/>
			<property name="p_version" type="string" length="20" insert="false" update="false"/>
			<property name="start" type="long" insert="false" update="false"/>
			<property name="end" type="long" insert="false" update="false"/>
		</component>
		<component name="original"  class ="MatchDatabaseRecord">
			<property name="geneid" type="long" insert="false" update="false"/>
			<property name="gi" type="long" insert="false" update="false"/>
			<property name="accession" type="string" length="20" insert="false" update="false"/>
			<property name="version" type="string" length="20" insert="false" update="false"/>
			<property name="p_gi" type="long" insert="false" update="false"/>
			<property name="p_accession" type="string" length="20" insert="false" update="false"/>
			<property name="p_version" type="string" length="20" insert="false" update="false"/>
			<property name="start" type="long" insert="false" update="false"/>
			<property name="end" type="long" insert="false" update="false"/>
		</component>
		<property name="match_status" type="string" length="30"/>
		<property name="reason" type="string" length="255"/>
		<property name="team" type="string" length="20"/>
		<property name="update_date" type="java.sql.Date"/>
		<property name="impact" type="string" length="8"/>
		<property name="prodid" type="long"/>
	</ class >

	<sql-query name="MatchRecordsLoader">
    < return  alias="rec"  class ="MatchRecord"/>
    	select 
    		mr.REPORT_ID as {rec.id},
    		mr.CLEAN_NAME as {rec.name}, 
    		c.CONTENT_NAME as {rec.type},
    		mr.CLEAN_SKU as {rec.sku},
    		pp.PROGRAM_ID as {rec.prognum},
    		matchc.CONTENT_NAME as {rec.match_type},
    		mr.UPDATED_GENE_ID as {rec.updated.geneid},
    		mr.UPDATED_GI as {rec.updated.gi},
    		mr.UPDATED_ACCESSION as {rec.updated.accession},
    		mr.UPDATED_VERSION as {rec.updated.version},
    		mr.UPDATED_P_GI as {rec.updated.p_gi},
    		mr.UPDATED_P_ACCESSION as {rec.updated.p_accession},
    		mr.UPDATED_P_VERSION as {rec.updated.p_version},
    		mr.UPDATED_START as {rec.updated.start},
    		mr.UPDATED_END as {rec.updated.end},
    		mr.ORIGINAL_GENE_ID as {rec.original.geneid},
    		mr.ORIGINAL_GI as {rec.original.gi},
    		mr.ORIGINAL_ACCESSION as {rec.original.accession},
    		mr.ORIGINAL_VERSION as {rec.original.version},
    		mr.ORIGINAL_P_GI as {rec.original.p_gi},
    		mr.ORIGINAL_P_ACCESSION as {rec.original.p_accession},
    		mr.ORIGINAL_P_VERSION as {rec.original.p_version},
    		mr.ORIGINAL_START as {rec.original.start},
    		mr.ORIGINAL_END as {rec.original.end},
    		s.DESCRIPTION as {rec.match_status},
    		mr.DESCRIPTION as {rec.reason},
    		t.TEAM_NAME as {rec.team},
    		mr.CREATED as {rec.update_date},
    		mr.IMPACT as {rec.impact},
    		p.PROD_ID as {rec.prodid}
    	from MATCH_REPORTS mr
    	inner join CONTENT c on 
    		mr.CONTENT_ID = c.CONTENT_ID 
    	inner join PRODUCT p on 
    		mr.PROD_ID = p.PROD_ID 
    	left outer join PRODUCT_PROGRAM pp on 
    		p.PROD_ID = pp.PROD_ID
    	inner join CONTENT matchc on 
    		mr.MATCHED_CONTENT_ID = matchc.CONTENT_ID
    	inner join STATUS s on 
    		mr.MATCH_STATUS_ID = s.STATUS_ID
    	inner join PRODUCT_PERMISSIONS perm on 
    		p.PROD_ID = perm.PROD_ID 
    	inner join TEAM_DEFS t on
    		perm.TEAM_ID = t.TEAM_ID
    	where 
    		IS_PRODUCT_READABLE( :userid, mr.PROD_ID) =  1  and
    		(mr.CONTENT_ID in (
    			select mrc.CONTENT_ID 
    			from MATCH_REPORT_CONTENT mrc 
    			WHERE mrc.ID = :matchid and 
    				((:forcurrent =  1  and mr.CREATED > mrc.LAST_DATE_SENT) or
    				(:forcurrent =  0  and mr.CREATED > :datefrom and mr.CREATED < :dateto))) 
    		or
    		mr.PROD_ID in (
    			select mrp.PROD_ID 
    			from MATCH_REPORT_PRODUCTS mrp 
    			WHERE mrp.ID = :matchid and 
    				((:forcurrent =  1  and mr.CREATED > mrp.LAST_DATE_SENT) or
    				(:forcurrent =  0  and mr.CREATED > :datefrom and mr.CREATED < :dateto)))) 
    	 order by p.PROD_ID, mr.CREATED
	</sql-query>


</hibernate-mapping>

Вот коде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	 public  MatchRecordsContainer( MatchContact mc)
	{
		Session session = HibernateUtil.currentSession();
		matched_list = session.getNamedQuery( "MatchRecordsLoader")
			.setLong( "userid", mc.getUserid())
			.setLong( "matchid", mc.getId())
			.setBoolean( "forcurrent", true)
			.setDate( "datefrom",  null )
			.setDate( "dateto",  null )
			.list();
		matched_contact = mc;
	}

А вот и SQL, который хибер сгенерил ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
select 
    		mr.REPORT_ID as id0_,
    		mr.CLEAN_NAME as name1_0_, 
    		mr.CLEAN_SKU as sku1_0_,
    		pp.PROGRAM_ID as prognum1_0_,
    		at.ASSOCIATION_NAME as assotype1_0_,
    		mr.UPDATED_ASSO_TO as assoto1_0_,
    		mr.UPDATED_GENE_ID as geneid1_0_,
    		mr.UPDATED_GI as gi1_0_,
    		mr.UPDATED_ACCESSION as accession1_0_,
    		mr.UPDATED_VERSION as version1_0_,
    		mr.UPDATED_P_GI as p11_1_0_,
    		mr.UPDATED_P_ACCESSION as p12_1_0_,
    		mr.UPDATED_P_VERSION as p13_1_0_,
    		mr.UPDATED_START as start1_0_,
    		mr.UPDATED_END as end1_0_,
    		mr.ORIGINAL_ASSO_TO as assoto1_0_,
    		mr.ORIGINAL_GENE_ID as geneid1_0_,
    		mr.ORIGINAL_GI as gi1_0_,
    		mr.ORIGINAL_ACCESSION as accession1_0_,
    		mr.ORIGINAL_VERSION as version1_0_,
    		mr.ORIGINAL_P_GI as p11_1_0_,
    		mr.ORIGINAL_P_ACCESSION as p12_1_0_,
    		mr.ORIGINAL_P_VERSION as p13_1_0_,
    		mr.ORIGINAL_START as start1_0_,
    		mr.ORIGINAL_END as end1_0_,
    		s.DESCRIPTION as match16_1_0_,
    		mr.DESCRIPTION as reason1_0_,
    		mr.CREATED as update18_1_0_,
    		mr.IMPACT as impact1_0_,
    		RESOLVE_PRODID( mr.ASSO_TYPE_ID, mr.ASSO_FROM) as prodid1_0_
    	from MATCH_REPORTS mr
    	left outer join PRODUCT_PROGRAM pp on 
    		RESOLVE_PRODID( mr.ASSO_TYPE_ID, mr.ASSO_FROM) = pp.PROD_ID
    	inner join STATUS s on 
    		mr.MATCH_STATUS_ID = s.STATUS_ID
    	inner join ASSOCIATION_TYPE at on 
    		mr.ASSO_TYPE_ID = at.ASSO_TYPE_ID 
    	where 
    		IS_PRODUCT_READABLE( ?, RESOLVE_PRODID( mr.ASSO_TYPE_ID, mr.ASSO_FROM)) =  1  and
    		(at.CONTENT_ID_FROM in (
    			select mrc.CONTENT_ID 
    			from MATCH_REPORT_CONTENT mrc 
    			WHERE mrc.ID = ? and 
    				((? =  1  and mr.CREATED > mrc.LAST_DATE_SENT) or
    				(? =  0  and mr.CREATED > ? and mr.CREATED < ?))) 
    		or
    		mr.ASSO_FROM in (
    			select mrp.PROD_ID 
    			from MATCH_REPORT_PRODUCTS mrp 
    			WHERE mrp.ID = ? and 
    				((? =  1  and mr.CREATED > mrp.LAST_DATE_SENT) or
    				(? =  0  and mr.CREATED > ? and mr.CREATED < ?)))) 
    	 order by mr.ASSO_FROM, mr.CREATED
Я думаю, усе теперя понятно.
...
Рейтинг: 0 / 0
Хибернет, туды его в качель ...
    #33261982
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пока вижу 2 варианта

- hibernate ошибся и неверно расставил column aliases. Я бы попробовал использовать <return-property/> чтобы указать алиасы вручную( 17.3.1. Using return-property to explicitly specify column/alias names )

- вполне возможно что ошибся не hibernate, а jdbc драйвер БД (у вас к стати что?)
...
Рейтинг: 0 / 0
Хибернет, туды его в качель ...
    #33262264
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот таки драйвы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?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="hibernate.connection.username">user</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@//{moderated}</property>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="show_sql">true</property>
        <property name="hibernate.default_schema">{moderated}</property>
        <!-- Mapping files -->
		<mapping resource="com/{moderated}/ds/model/MatchContacts.hbm.xml"/> 
		<mapping resource="com/{moderated}/ds/model/NotifyContacts.hbm.xml"/> 
		<mapping resource="com/{moderated}/ds/model/Gene.hbm.xml"/> 
		<mapping resource="com/{moderated}/ds/model/Product.hbm.xml"/>  
		<mapping resource="com/{moderated}/ds/model/Users.hbm.xml"/> 
		<mapping resource="com/{moderated}/ds/model/AssociationItem.hbm.xml"/> 
		<mapping resource="com/{moderated}/ds/model/Clone.hbm.xml"/> 
	</session-factory>
</hibernate-configuration>


Ну а с property я попробую поиграть ...
...
Рейтинг: 0 / 0
Хибернет, туды его в качель ...
    #33269938
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну шо, поборол, однако. С фуниково-юрьевской помощью (большой спасиб!). Вот, пожалте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
<sql-query name="MatchRecordsLoader">
    < return  alias="rec"  class ="MatchRecord">
          < return -property name="updated"> 
               < return -column name="rec_updated_assoto"/>
               < return -column name="rec_updated_geneid"/>
               < return -column name="rec_updated_gi"/>
               < return -column name="rec_updated_accession"/>
               < return -column name="rec_updated_version"/>
               < return -column name="rec_updated_p_gi"/>
               < return -column name="rec_updated_p_accession"/>
               < return -column name="rec_updated_p_version"/>
               < return -column name="rec_updated_start"/>
               < return -column name="rec_updated_end"/>
          </ return -property>
          < return -property name="original"> 
               < return -column name="rec_original_assoto"/>
               < return -column name="rec_original_geneid"/>
               < return -column name="rec_original_gi"/>
               < return -column name="rec_original_accession"/>
               < return -column name="rec_original_version"/>
               < return -column name="rec_original_p_gi"/>
               < return -column name="rec_original_p_accession"/>
               < return -column name="rec_original_p_version"/>
               < return -column name="rec_original_start"/>
               < return -column name="rec_original_end"/>
          </ return -property>
    </ return >
    	select 
    		mr.REPORT_ID as {rec.id},
    		mr.CLEAN_NAME as {rec.name}, 
    		mr.CLEAN_SKU as {rec.sku},
    		pp.PROGRAM_ID as {rec.prognum},
    		at.ASSOCIATION_NAME as {rec.assotype},
    		mr.UPDATED_ASSO_TO as rec_updated_assoto,
    		mr.UPDATED_GENE_ID as rec_updated_geneid,
    		mr.UPDATED_GI as rec_updated_gi,
    		mr.UPDATED_ACCESSION as rec_updated_accession,
    		mr.UPDATED_VERSION as rec_updated_version,
    		mr.UPDATED_P_GI as rec_updated_p_gi,
    		mr.UPDATED_P_ACCESSION as rec_updated_p_accession,
    		mr.UPDATED_P_VERSION as rec_updated_p_version,
    		mr.UPDATED_START as rec_updated_start,
    		mr.UPDATED_END as rec_updated_end,
    		mr.ORIGINAL_ASSO_TO as rec_original_assoto,
    		mr.ORIGINAL_GENE_ID as rec_original_geneid,
    		mr.ORIGINAL_GI as rec_original_gi,
    		mr.ORIGINAL_ACCESSION as rec_original_accession,
    		mr.ORIGINAL_VERSION as rec_original_version,
    		mr.ORIGINAL_P_GI as rec_original_p_gi,
    		mr.ORIGINAL_P_ACCESSION as rec_original_p_accession,
    		mr.ORIGINAL_P_VERSION as rec_original_p_version,
    		mr.ORIGINAL_START as rec_original_start,
    		mr.ORIGINAL_END as rec_original_end,
    		s.DESCRIPTION as {rec.match_status},
    		mr.DESCRIPTION as {rec.reason},
    		mr.CREATED as {rec.update_date},
    		mr.IMPACT as {rec.impact},
    		RESOLVE_PRODID( mr.ASSO_TYPE_ID, mr.ASSO_FROM) as {rec.prodid}
    	from MATCH_REPORTS mr
    	left outer join PRODUCT_PROGRAM pp on 
    		RESOLVE_PRODID( mr.ASSO_TYPE_ID, mr.ASSO_FROM) = pp.PROD_ID
    	inner join STATUS s on 
    		mr.UPDATED_STATUS_ID = s.STATUS_ID
    	inner join ASSOCIATION_TYPE at on 
    		mr.ASSO_TYPE_ID = at.ASSO_TYPE_ID 
    	where 
    		IS_PRODUCT_READABLE( :userid, RESOLVE_PRODID( mr.ASSO_TYPE_ID, mr.ASSO_FROM)) =  1  and
    		(at.CONTENT_ID_FROM in (
    			select mrc.CONTENT_ID 
    			from MATCH_REPORT_CONTENT mrc 
    			WHERE mrc.ID = :matchid and 
    				((:forcurrent =  1  and mr.CREATED > mrc.LAST_DATE_SENT) or
    				(:forcurrent =  0  and mr.CREATED > :datefrom and mr.CREATED < :dateto))) 
    		or
    		mr.ASSO_FROM in (
    			select mrp.PROD_ID 
    			from MATCH_REPORT_PRODUCTS mrp 
    			WHERE mrp.ID = :matchid and 
    				((:forcurrent =  1  and mr.CREATED > mrp.LAST_DATE_SENT) or
    				(:forcurrent =  0  and mr.CREATED > :datefrom and mr.CREATED < :dateto)))) 
    	 order by mr.ASSO_FROM, mr.CREATED desc
	</sql-query>
...
Рейтинг: 0 / 0
Хибернет, туды его в качель ...
    #33284807
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хибер таки злобный! Под конец таки опять пакость подсунул

Было у меня коде типа
Код: plaintext
1.
 Long  id = mr.getUpgated().getId()

иде Updated - тот самый компонент. И встретилась запись, иде все поля UPDATED_* is NULL. Так хибер и сам Updated занулил - во сволочь! Ну и получил я NullPointerException. Хорошо, что такого кода не много было - исправлять недолго.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Хибернет, туды его в качель ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]