powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ERROR: duplicate key value violates unique constraint при сохранении объекта
14 сообщений из 14, страница 1 из 1
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39066808
NDAleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дброго всем времени!
Есть сущности 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
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39066866
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели все всё поняли? ) Я ничего не понял :(
Что значит " но еще и пытается создать все сущности, которые инкапсулирует обект value?" (
(хибернейт не тыкал еще))
Ощущение, надо четко понимать что происходит в session.save(value);
Скорее идет инесрт/апдейт в базу (что странно само по себе имхо), а на таблице уникальный ключ, то ну что тут поделаешь, так и должно быть ).
Вообще выглядит странно, что мы вроде как сохраняем значение определенной "сущности", при этом говоря session.save(value);
Почему бы не сделать метод save именно этой сущности?? )
...
Рейтинг: 0 / 0
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39066874
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NDAleksey,

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

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

А в базе случайно нет констрейнта, который этот Many2One превращает в One2One? Меня смущает unique="true"
...
Рейтинг: 0 / 0
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39067110
NDAleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39067125
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NDAlekseyCREATE UNIQUE INDEX uk_hwaanymqg2t9grhc2ko9migl0 ON characteristic_value USING BTREE (characteristic_id);

Ну, вот же. One-to-One у вас в базе получился. Падает скорее всего не из-за pk, а из-за этого констрейнта
...
Рейтинг: 0 / 0
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39067146
NDAleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, все-все, дико извняюсь за топик.... все работает.... вызывал addCharacteristicValue и addCharacteristicValue друг за другом! Спасибо, но сам затупил дико.
...
Рейтинг: 0 / 0
ERROR: duplicate key value violates unique constraint при сохранении объекта
    #39067175
NDAleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / ERROR: duplicate key value violates unique constraint при сохранении объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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