Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ERROR: duplicate key value violates unique constraint при сохранении объекта / 14 сообщений из 14, страница 1 из 1
02.10.2015, 10:50
    #39066808
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
Дброго всем времени!
Есть сущности Characteristic и CharacteristicValue (hbm.xml пока не привожу). Каждый объект второй содержит один одъект первой.
Т.е. у нас есть характеристика (name: Скорость полета) и значение характеристики (characteristic: Скорость полета; value: 100). И есть метод загрузки значения характеристики - addCharacteristicValue(String value, Characteristic characteristic);

Код: java
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.
class Characteristic {
	int id;
	String name;

	//getters/setters
}

class CharacteristicValue {
	int id;
	Characteristic characteristic;
	String value;

	public CharacteristicValue(String value, Characteristic characteristic) {
		this.value = value;
		this.characteristic = characteristic;
	}

	//getters/setters
}


public void addCharacteristicValue(String value, Characteristic characteristic) {
	Session sesion = factory.openSession();
	Transaction t = null;

	try {
		CharacteristicValue value = new CharacteristicValue(value, characteristic);
		t = session.beginTransaction();
		session.save(value);
		t.commit();		
	} catch(Exception ex) {
		if (t != null) {t.rollback();}
		ex.printStackTrace();
	} finally {
		session.close();
	}
}


Все бы ничего, но возникают ошибки, если мы передаем в метод добавления объекты, уже существующих характеристик в БД (ERROR: duplicate key value violates unique constraint).
Т.е. возникает вопрос. Если я формирую объект CharacteristicValue. И вызываю метод его сохрнанения
Код: java
1.
session.save(value);


Но при этом предварительно создаем характеристики и одну из них передаем нашему value , то hibernate получается создает не только данную сущность (CharacteristicValue) в таблице, но еще и пытается создать все сущности, которые инкапсулирует обект value ? Т.е. в данном случае - создает новый новую запись в таблице Characteristic..... Так что ли?
...
Рейтинг: 0 / 0
02.10.2015, 11:30
    #39066866
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
Неужели все всё поняли? ) Я ничего не понял :(
Что значит " но еще и пытается создать все сущности, которые инкапсулирует обект value?" (
(хибернейт не тыкал еще))
Ощущение, надо четко понимать что происходит в session.save(value);
Скорее идет инесрт/апдейт в базу (что странно само по себе имхо), а на таблице уникальный ключ, то ну что тут поделаешь, так и должно быть ).
Вообще выглядит странно, что мы вроде как сохраняем значение определенной "сущности", при этом говоря session.save(value);
Почему бы не сделать метод save именно этой сущности?? )
...
Рейтинг: 0 / 0
02.10.2015, 11:35
    #39066874
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
NDAleksey,

Вообще странно. Не должно такого быть. Хотелось бы все же увидеть маппинг и узнать почему он не в аннотациях.
...
Рейтинг: 0 / 0
02.10.2015, 11:37
    #39066878
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
Такое может быть если id замаплен как обычное свойство, а не как id.
...
Рейтинг: 0 / 0
02.10.2015, 11:37
    #39066879
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
Т.е. ты говоришь session.save(value);
Вот просто session.save(); еще можно было бы понять, можно было бы понять что-то типа Characteristic.save(value),
но session.save(value); имхо негуд, странная модель.
...
Рейтинг: 0 / 0
02.10.2015, 11:38
    #39066884
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
NDAleksey,

Попробуй Session.saveOrUpdate() вместо Session.save()
...
Рейтинг: 0 / 0
02.10.2015, 11:39
    #39066886
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
JDSТ.е. ты говоришь session.save(value);
Вот просто session.save(); еще можно было бы понять, можно было бы понять что-то типа Characteristic.save(value),
но session.save(value); имхо негуд, странная модель.
:D
Может таки почитаешь туториал по Hibernate для начала?
...
Рейтинг: 0 / 0
02.10.2015, 11:46
    #39066895
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
Blazkowicz:D Может таки почитаешь туториал по Hibernate для начала?
Кажется догадываюсь как это примерно может выглядеть внутри: )
типа дальше session смотрит какой именно объект сохраняется и вызывает его метод условно execute. Доберусь, почитаю )
Но все равно Session.save(value) звучит как-то непривычно, типа как если commit(value) в СУБД
хотя бы Session.save(characteristic) :)
...
Рейтинг: 0 / 0
02.10.2015, 12:24
    #39066965
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
BlazkowiczNDAleksey,

Попробуй Session.saveOrUpdate() вместо Session.save()

Я и это пробовал, но не помогло. Вот пришел узнать сюда, как реально устроено у Hibernate. Вот маппинг (не через аннотация - мне так удобнее):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<hibernate-mapping>
    <class name="Characteristic" table="CHARACTERISTIC">
        <id name="id" column="ID">
            <generator class="native"/>
        </id>

        <property name="name" column="NAME" type="string"/>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="CharacteristicValue" table="CHARACTERISTIC_VALUE">
        <id name="id" column="ID">
            <generator class="native"/>
        </id>

        <property name="value" column="VALUE" type="string"/>


        <many-to-one name="characteristic" column="CHARACTERISTIC_ID" class="Characteristic" unique="true"
                     not-null="true" lazy="false"/>
    </class>
</hibernate-mapping>
...
Рейтинг: 0 / 0
02.10.2015, 12:42
    #39067009
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
NDAleksey,

А в базе случайно нет констрейнта, который этот Many2One превращает в One2One? Меня смущает unique="true"
...
Рейтинг: 0 / 0
02.10.2015, 13:48
    #39067110
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
BlazkowiczNDAleksey,

А в базе случайно нет констрейнта, который этот Many2One превращает в One2One? Меня смущает unique="true"

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE public.characteristic_value (
  id INTEGER PRIMARY KEY NOT NULL,
  value CHARACTER VARYING(255),
  characteristic_id INTEGER NOT NULL,
  idx INTEGER,
  FOREIGN KEY (characteristic_id) REFERENCES characteristic (id)
  MATCH UNKNOWN ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE UNIQUE INDEX uk_hwaanymqg2t9grhc2ko9migl0 ON characteristic_value USING BTREE (characteristic_id);


CREATE TABLE public.characteristic (
  id INTEGER PRIMARY KEY NOT NULL,
  name CHARACTER VARYING(255),
  idx INTEGER
);
...
Рейтинг: 0 / 0
02.10.2015, 14:00
    #39067125
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
NDAlekseyCREATE UNIQUE INDEX uk_hwaanymqg2t9grhc2ko9migl0 ON characteristic_value USING BTREE (characteristic_id);

Ну, вот же. One-to-One у вас в базе получился. Падает скорее всего не из-за pk, а из-за этого констрейнта
...
Рейтинг: 0 / 0
02.10.2015, 14:23
    #39067146
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
Blazkowicz, все-все, дико извняюсь за топик.... все работает.... вызывал addCharacteristicValue и addCharacteristicValue друг за другом! Спасибо, но сам затупил дико.
...
Рейтинг: 0 / 0
02.10.2015, 14:47
    #39067175
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR: duplicate key value violates unique constraint при сохранении объекта
BlazkowiczNDAlekseyCREATE UNIQUE INDEX uk_hwaanymqg2t9grhc2ko9migl0 ON characteristic_value USING BTREE (characteristic_id);

Ну, вот же. One-to-One у вас в базе получился. Падает скорее всего не из-за pk, а из-за этого констрейнта

Да-да, Вы правы. Поменял в мапере
Код: xml
1.
2.
<many-to-one name="characteristic" column="CHARACTERISTIC_ID" class="Characteristic" unique="true"
                     not-null="true" lazy="false"/>


на
Код: xml
1.
2.
<many-to-one name="characteristic" column="CHARACTERISTIC_ID" class="Characteristic" not-null="true"
                     lazy="false"/>


Убрал это ограничение! Спасибо!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ERROR: duplicate key value violates unique constraint при сохранении объекта / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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