powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate inheritance mapping
11 сообщений из 11, страница 1 из 1
hibernate inheritance mapping
    #34861801
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет.
коллеги помогите плз. расковырять проблему.
Дело в следующем. Имеются три класса: Article (abstract), Textile (extends Article), Supplier (extends Person). Отношения между Supplier и Article типа один-ко-многим. Классы Supplier и Textile производятся соответствующими фабриками в разное время. Сначало создаются(читаются из бд) Supplier которые формируют модель для JComboBox , потом Textile.
Создание Article выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Article tempArticle = commodityGroup.getArticleFabric().produceArticle();
logger.debug("new temporally article produced");

 if  (tempArticle.getSupplier() ==  null ) {
	Supplier supplier = (Supplier)supplierComboboxModel.getElementAt( 0 );
			 if  (supplier !=  null ) {
				tempArticle.setSupplier(supplier);
// !!!!				supplier.getArticles().add(tempArticle);
			}
		}
Потом заполняются свойства обоих классов (Article и Textile) и выбирается сохранение:
Код: plaintext
1.
2.
3.
Transaction tr = session.beginTransaction();
session.save(tempArticle);
tr.commit();
так вот пародокс заключается в том, что все сохраняется без единой ошибки и в каждой таблице так же появляются соответствующие записи. Только вот поля
ind (типа long) класов Article и Textile имеют разные значения ! Для Textile значение ind=1, a для Article ind=2. Это приводит к тому, что после объединения таблиц - результирующий набор данных пуст.
Я закомментировал место, в котором в классе Supplier добавляется новый Article и все работает нормально. Только в этом случае нарушается логика: Supplier уже не имеет обратной связи со своими Article.

Сдесь представлен Supplier (Supplier расширяет класс Person):

Код: 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.
<hibernate-mapping>
	< class  name="core.common.Person" table="Person">
		<id name="id" column="PersonID">
			<generator  class ="native" />
		</id>

		<property name="personTitle" column="PersonTitle" />


		<joined-subclass name="article.supplier.Supplier"
			table="Supplier">
			<key column="SupplierID" />
			<property name="description" column="Description" />

			<set name="articles">
				<key column="ArticleID" not- null ="false" />
				<one-to-many  class ="article.entities.Article" />
			</set>
		

		</joined-subclass>


		<joined-subclass name="core.common.Bank" table="Bank">
			<key column="BankID" />

			<property name="accountNumber" column="AccountNumber" />
			<property name="bankCode" column="BankCode" />
			<property name="accountOwner" column="AccountOwner" />
			<property name="iban" column="IBAN" />

		</joined-subclass>
	</ class >
</hibernate-mapping>

Сдесь карта Article:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<hibernate-mapping>
	< class  name="article.entities.Article" table="Article">
		<id name="id" column="ArticleID">
			<generator  class ="native" />
		</id>


		<many-to-one name="supplier" column="SupplierID" not- null ="true" />

		<joined-subclass name="article.textile.Textile"
			table="TEXTILE">
			<key column="TextileID" />
			<property name="stuff" column="Stuff" />
		</joined-subclass>
	</ class >
</hibernate-mapping>

К сожалению я не очень опытный с Hibernate и я вообще уже не пойму где проблема сокрыта. уже вторые сутки бьюсь.
плз хелп
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34862090
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнаю, сообственно по твоему вопросу ответить не смогу, ничего не заметил, но несколько общих замечаний.
Хибернет хибернатом, но ты не забывай что ты с реляционной базой работаешь. И просто так переложить объектную модель со всем наследованием у тебя ничего хорошего из этого не получится. Хибернат конечно облегчает реализацию наследования, но это не значит что этим можно злоупотреблять. Imho ты взял самую сложную схему "Таблица для каждого класса" и используешь ее слишком часто. При этом чтобы объект сохранить/получить у тебя куча операций будет с разными таблицами.

ЗЫ Попробуй другую схему наследования "Единая таблица для иерархии".
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34862350
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вестимо - гомно вопрос...

ток ни бельмаса не ясно чо стряслось и шо надо ....

по проще расскажи
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34862501
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppвестимо - гомно вопрос...

ток ни бельмаса не ясно чо стряслось и шо надо ....

по проще расскажи

стряслось то, что в текущей конфигурации отношений между классами - сохранение последних приводит к ошибке. Ошибка возникает в таблицах Article и Textile. По нормальному ключи таблиц (primary key) должны быть идентичными, а у меня хибернейт генерирует разные.

Я уже эксперимента ради отдельно проект открыл и там испытал эти связи. В эксерименте эта схема работает нормально, в проекте же глючит. Попробую другую схему применить для реализации наследования.
Но если кто поделится опытом - спасибо.
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34862622
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажи тест. из которого ясно что ты делаешь с твоими объедками

и покеш лог. и исходники
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34862651
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kadetПо нормальному ключи таблиц (primary key) Вообще, первичный в Article, внешний в Textile должны быть. Подобный маппинг вполне себе можно применять.
Код: plaintext
1.
2.
3.
4.
<set name="articles">
<key column="ArticleID" not- null ="false" />
<one-to-many  class ="article.entities.Article" />
</set>
Вместо ArticleID нужно SupplierID, и почему у вас not-null="false" ведь как я понял(если не ошибаюсь) Article не имеет смысла без Supplier-а
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34863724
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppпокажи тест. из которого ясно что ты делаешь с твоими объедками

и покеш лог. и исходники

Приложил
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34864082
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalexaka
Вместо ArticleID нужно SupplierID,

господин zalexaka . Низкий вам поклон. После корректировки все нормально.

zalexaka
и почему у вас not-null="false" ведь как я понял(если не ошибаюсь) Article не имеет смысла без Supplier-а

Вы правы. Article не имеет смысла без Supplier. Я поставил тут false просто потому, чтобы обойти ошибки, которые вываливаются в самом начале, когда хибер создает таблицы, и из пустых таблиц потом пытается прочитать Article:
Код: 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.
%%%% Error Creating SessionFactory %%%%
org.hibernate.MappingException: Repeated column in mapping  for  entity: article.entities.Article column: SupplierID (should be mapped with insert="false" update="false")
	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java: 652 )
	at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java: 674 )
	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java: 696 )
	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java: 450 )
	at org.hibernate.mapping.RootClass.validate(RootClass.java: 192 )
	at org.hibernate.cfg.Configuration.validate(Configuration.java: 1102 )
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java: 1287 )
	at article.persistance.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java: 31 )
	at article.supplier.fabric.SupplierFabric.getSession(SupplierFabric.java: 245 )
	at article.supplier.fabric.SupplierFabric.<init>(SupplierFabric.java: 231 )
	at article.supplier.SupplierDialog.<init>(SupplierDialog.java: 170 )
	at article.model.GoodsManagement$ObjectsManager$ControlledObjectsManagerImpl.getControlledObject(GoodsManagement.java: 182 )
	at article.model.GoodsManagement$SupplierDialogEventProcessor.init(GoodsManagement.java: 3761 )
	at article.model.GoodsManagement$SupplierDialogEventProcessor.access$ 2 (GoodsManagement.java: 3760 )
	at article.model.GoodsManagement.setControlledObjectsMap(GoodsManagement.java: 292 )
	at com.evelopers.unimod.runtime.ModelEngine.createStandAlone(ModelEngine.java: 73 )
	at article.model.GoodsManagement.createModelEngine(GoodsManagement.java: 111 )
	at article.model.GoodsModelAdapter.run(GoodsModelAdapter.java: 107 )
	at article.model.GoodsModelAdapter.<init>(GoodsModelAdapter.java: 94 )
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0( Native  Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java: 39 )
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 27 )
	at java.lang.reflect.Constructor.newInstance(Constructor.java: 494 )
	at java.lang. Class .newInstance0( Class .java: 350 )
	at java.lang. Class .newInstance( Class .java: 303 )
	at systemcore.Transmitter.z3(Transmitter.java: 152 )
	at model.Sinderella$A1EventProcessor.lookForTransition(Sinderella.java: 1084 )
	at model.Sinderella$A1EventProcessor.process(Sinderella.java: 596 )
	at model.Sinderella$A1EventProcessor.access$ 3 (Sinderella.java: 595 )
	at model.Sinderella.process(Sinderella.java: 321 )
	at com.evelopers.unimod.runtime.AbstractEventProcessor.process(AbstractEventProcessor.java: 119 )
	at com.evelopers.unimod.runtime.AbstractEventProcessor.process(AbstractEventProcessor.java: 81 )
	at com.evelopers.unimod.runtime.ModelEngine.process(ModelEngine.java: 199 )
	at com.evelopers.unimod.runtime.QueuedHandler$QueueMessageProcessorImpl.processMessage(QueuedHandler.java: 100 )
	at com.evelopers.common.concurrent.AbstractQueue$EventPump.run(AbstractQueue.java: 114 )
%%%% Error Creating SessionFactory %%%%
org.hibernate.InvalidMappingException: Could not parse mapping document from resource article/entities/Article.hbm.xml
	at org.hibernate.cfg.Configuration.addResource(Configuration.java: 569 )
	at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java: 1587 )
	at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java: 1555 )
	at org.hibernate.cfg.Configuration.doConfigure(Configuration.java: 1534 )
	at org.hibernate.cfg.Configuration.doConfigure(Configuration.java: 1508 )
	at org.hibernate.cfg.Configuration.configure(Configuration.java: 1428 )
	at article.persistance.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java: 69 )
	at article.persistance.HibernateSessionFactory.getSession(HibernateSessionFactory.java: 53 )
	at article.supplier.fabric.SupplierFabric.getSession(SupplierFabric.java: 245 )
	at article.supplier.fabric.SupplierFabric.<init>(SupplierFabric.java: 231 )
	at article.supplier.SupplierDialog.<init>(SupplierDialog.java: 170 )
	at article.model.GoodsManagement$ObjectsManager$ControlledObjectsManagerImpl.getControlledObject(GoodsManagement.java: 182 )
	at article.model.GoodsManagement$SupplierDialogEventProcessor.init(GoodsManagement.java: 3761 )
	at article.model.GoodsManagement$SupplierDialogEventProcessor.access$ 2 (GoodsManagement.java: 3760 )
	at article.model.GoodsManagement.setControlledObjectsMap(GoodsManagement.java: 292 )
	at com.evelopers.unimod.runtime.ModelEngine.createStandAlone(ModelEngine.java: 73 )
	at article.model.GoodsManagement.createModelEngine(GoodsManagement.java: 111 )
	at article.model.GoodsModelAdapter.run(GoodsModelAdapter.java: 107 )
	at article.model.GoodsModelAdapter.<init>(GoodsModelAdapter.java: 94 )
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0( Native  Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java: 39 )
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 27 )
	at java.lang.reflect.Constructor.newInstance(Constructor.java: 494 )
	at java.lang. Class .newInstance0( Class .java: 350 )
	at java.lang. Class .newInstance( Class .java: 303 )
	at systemcore.Transmitter.z3(Transmitter.java: 152 )
	at model.Sinderella$A1EventProcessor.lookForTransition(Sinderella.java: 1084 )
	at model.Sinderella$A1EventProcessor.process(Sinderella.java: 596 )
	at model.Sinderella$A1EventProcessor.access$ 3 (Sinderella.java: 595 )
	at model.Sinderella.process(Sinderella.java: 321 )
	at com.evelopers.unimod.runtime.AbstractEventProcessor.process(AbstractEventProcessor.java: 119 )
	at com.evelopers.unimod.runtime.AbstractEventProcessor.process(AbstractEventProcessor.java: 81 )
	at com.evelopers.unimod.runtime.ModelEngine.process(ModelEngine.java: 199 )
	at com.evelopers.unimod.runtime.QueuedHandler$QueueMessageProcessorImpl.processMessage(QueuedHandler.java: 100 )
	at com.evelopers.common.concurrent.AbstractQueue$EventPump.run(AbstractQueue.java: 114 )
Caused by: org.hibernate.DuplicateMappingException: Duplicate  class /entity mapping article.foodstuff.Foodstuff
	at org.hibernate.cfg.Mappings.addClass(Mappings.java: 118 )
	at org.hibernate.cfg.HbmBinder.handleJoinedSubclass(HbmBinder.java: 2214 )
	at org.hibernate.cfg.HbmBinder.createClassProperties(HbmBinder.java: 2114 )
	at org.hibernate.cfg.HbmBinder.createClassProperties(HbmBinder.java: 2041 )
	at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java: 359 )
	at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java: 273 )
	at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java: 144 )
	at org.hibernate.cfg.Configuration.add(Configuration.java: 669 )
	at org.hibernate.cfg.Configuration.addInputStream(Configuration.java: 504 )
	at org.hibernate.cfg.Configuration.addResource(Configuration.java: 566 )
	...  34  more
конечно по логике надо ставить not-null="true", но я вот не знаю как предотвратить ошибки в этом случае.
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34864523
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kadetЯ поставил тут false просто потому, чтобы обойти ошибки пытается прочитать Article:
Код: plaintext
1.
org.hibernate.MappingException: Repeated column in mapping  for  entity: article.entities.Article column: SupplierID (should be mapped with insert="false" update="false")
конечно по логике надо ставить not-null="true", но я вот не знаю как предотвратить ошибки в этом случае.

Простой bidirectional one-to-many с пом. inverse="true" все чудеса произойдут сами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<joined-subclass name="article.supplier.Supplier" table="Supplier">
...
<set name="articles" inverse="true">
  <key column="SupplierID" not- null ="true" />
  <one-to-many  class ="article.entities.Article"/>
</set>
...
<.joined-subclass/>

< class  name="article.entities.Article" table="Article">
...
<many-to-one name="supplier" column="SupplierID" not- null ="true" update="false"/>
...
</ class >

а update="false" позволит избежать лишнего апдейта внешнего ключа в таблице Article
Удачи.
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34864536
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
<.joined-subclass/>
читать как:
Код: plaintext
</joined-subclass>
конечно :)
...
Рейтинг: 0 / 0
hibernate inheritance mapping
    #34864840
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to zalexaka,

Большое Вам спасибо !
Действительно теперь все ровно.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate inheritance mapping
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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