휴지 상태 오류: org.hibernate.NonUniqueObjectException: 동일한 식별자 값을 가진 다른 개체가 세션에 이미 연결되어 있습니다.
두 개의 사용자 개체가 있으며 개체를 저장하는 동안
session.save(userObj);
다음의 에러가 표시됩니다.
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]
세션을 만들고 있습니다.
BaseHibernateDAO dao = new BaseHibernateDAO();
rtsession = dao.getSession(userData.getRegion(),
BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);
rttrans = rtsession.beginTransaction();
rttrans.begin();
rtsession.save(userObj1);
rtsession.save(userObj2);
rtsession.flush();
rttrans.commit();
rtsession.close(); // in finally block
도 '아예'를 했어요.session.clear()
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
이것은 사용자 요청이 왔을 때 처음으로 session 객체를 취득하는 것이기 때문에 그 객체가 세션에 존재한다고 하는 이유를 알 수 있습니다.
좋은 의견이라도 있나?
이 에러는 여러 번 발생하고 있습니다만, 추적하는 것은 매우 어려울 수 있습니다.
기본적으로 hibernate는 ID(프라이머리 키)는 같지만 동일한 개체가 아닌 두 개체가 있다는 것을 의미합니다.
에러가 해소될 때까지 비트를 코멘트하고 나서, 에러가 재발해, 에러가 검출될 때까지 코드를 되돌리는 것을 추천합니다.
대부분의 경우 오브젝트A와 B 사이에 캐스케이드 세이브가 있지만 오브젝트B는 이미 세션에 관련되어 있지만 A의 인스턴스와 같은 B 인스턴스에 있지 않습니다.
어떤 기본 키 생성기를 사용하고 있습니까?
이 오류는 개체의 지속 상태를 확인하기 위해 휴지 상태(즉, 개체의 지속성 여부)를 확인하는 방법과 관련이 있기 때문입니다.휴지 상태가 이미 지속된 개체를 유지하려고 하기 때문에 오류가 발생할 수 있습니다.실제로 save hibernate를 사용하면 해당 오브젝트가 유지되고 동일한 프라이머리 키를 가진 오브젝트가 이미 세션에 관련되어 있을 수 있습니다.
예
프라이머리 키의 조합(컬럼 1과 컬럼 2)에 근거해 10 행이 있는 테이블에 휴지 상태 클래스 오브젝트가 있다고 가정합니다.어느 시점에서 테이블에서 5개의 행을 삭제했습니다.이제 동일한 10 행을 다시 추가하려고 하면 휴지 상태가 데이터베이스에 개체를 유지하려고 할 때 이미 제거된 5 행이 오류 없이 추가됩니다.이제 이미 존재하는 나머지 5개의 행은 이 예외를 발생시킵니다.
따라서 간단한 접근법은 테이블의 일부인 값을 업데이트/삭제했는지 확인하고 나중에 동일한 개체를 다시 삽입하려고 하는지 확인하는 것입니다.
이것은, 동면시의 문제가 해결되는 것보다 더 많은 지점일 뿐입니다.이 경우 동일한 ID가 0인 객체가 많이 있습니다.이 객체는 새것이고 존재하지 않기 때문입니다.db가 생성합니다.어디선가 0 신호 Id가 설정되지 않았다고 읽었어요.직관적인 방법으로 오브젝트 위에서 반복하고 오브젝트를 저장하기 위해 휴지 상태라고 말하는 것입니다.하지만 그렇게 할 수는 없어요.물론 휴지상태는 이것저것 작동한다는 것을 알아야 합니다.따라서 당신은...이제 ID를 long이 아닌 Long으로 변경하여 동작하는지 확인할 수 있습니다.휴면상태는 부모에 대한 부담만 가중시키기 때문에 결국 간단한 매퍼만으로 쉽게 할 수 있습니다.또 다른 예는 다음과 같습니다.한 데이터베이스에서 매개 변수를 읽고 다른 데이터베이스에서 유지하려고 하면 거의 모든 작업을 수동으로 수행해야 합니다.하지만 굳이 해야 한다면, 휴지 상태를 사용하는 것은 단지 추가 작업일 뿐입니다.
の ★★★★★session.evict(object);
의 evict()
method는 세션캐시에서 인스턴스를 삭제하는 데 사용됩니다.오브젝트를 처음 합니다.session.save(object)
캐시에서 개체를 제거하기 전에 메서드를 지정합니다.로 오브젝트를 하려면 , 「」를 호출합니다.session.saveOrUpdate(object)
★★★★★★★★★★★★★★★★★」session.update(object)
퇴거를 호출하기 전에
이 문제는 읽기 및 쓰기에 동일한 세션개체를 사용했을 때 발생할 수 있습니다.어떻게요?세션이 1개 생성되었다고 가정합니다.직원 테이블에서 기본 키 Emp_id=101 레코드를 읽었습니다. 이제 Java에서 레코드를 수정했습니다.그리고 Employee 레코드를 데이터베이스에 저장합니다.여기 어디에도 세션이 종료되지 않았습니다.읽은 개체도 세션에서 유지됩니다.쓰고 싶은 오브젝트와 충돌합니다.따라서 이 에러가 발생합니다.
, 이.cascade=all
one-to-many
A -> B(> B)를 사용하여 B(O)를 저장하기 위해 A)를 호출하여 A)를 저장하였다.10A - > B ( > B ) a 、 B ( O ) 、 A ) 。 예외가 발생하였습니다. duplicateObject는duplicateObject 예외가 발생하였습니다.
한쪽 끝에서 캐스케이드를 제거함으로써 해결할 수 있었습니다.
하시면 됩니다.session.merge(obj)
동일한 식별자 영속 개체를 가진 다른 세션으로 저장하는 경우.
공했, 、 도도전전전전문 。
이 문제에 부딪힌 것은 다음과 같습니다.
- 오브젝트 삭제(HQL 사용)
- 동일한 ID로 새 개체 즉시 저장
삭제 후 결과를 플러시하고 새 개체를 저장하기 전에 캐시를 지워서 해결했습니다.
String delQuery = "DELETE FROM OasisNode";
session.createQuery( delQuery ).executeUpdate();
session.flush();
session.clear();
이 문제는 데이터베이스에서 개체를 가져오는 데 사용한 세션의 동일한 개체를 업데이트할 때 발생합니다.
업데이트 방식 대신 휴지 상태의 병합 방식을 사용할 수 있습니다.
예를 들어 먼저 session.get()을 사용하고 다음으로 session.merge(개체)를 사용할 수 있습니다.이 방법으로는 문제가 발생하지 않습니다.merge() 메서드를 사용하여 데이터베이스 내의 객체를 갱신할 수도 있습니다.
저도 이 문제에 부딪혀 오류를 찾기가 어려웠습니다.
제가 안고 있던 문제는 다음과 같습니다.
다른 휴지 상태 세션에서 Dao가 개체를 읽었습니다.
이 예외를 방지하려면 나중에 이 개체를 저장/업데이트할 dao를 사용하여 개체를 다시 읽기만 하면 됩니다.
따라서:
class A{
readFoo(){
someDaoA.read(myBadAssObject); //Different Session than in class B
}
}
class B{
saveFoo(){
someDaoB.read(myBadAssObjectAgain); //Different Session than in class A
[...]
myBadAssObjectAgain.fooValue = 'bar';
persist();
}
}
몇몇 사람들이 많은 시간을 절약하길 바랍니다!
세션 내의 개체를 가져옵니다.다음 예시는 다음과 같습니다.
MyObject ob = null;
ob = (MyObject) session.get(MyObject.class, id);
디폴트로는 아이덴티티 전략을 사용하고 있습니다만, 저는 이 전략을 추가함으로써 수정했습니다.
@ID
@GeneratedValue(strategy = GenerationType.IDENTITY)
ID 매핑이 올바릅니까?데이터베이스가 ID를 통해 ID를 생성하는 경우 사용자 개체를 ID에 매핑해야 합니다.
@Id 컬럼에 @GenerateValue를 입력하지 않은 경우 체크합니다.나는 영화와 장르의 많은 관계에서 같은 문제가 있었다.프로그램이 휴지 상태 오류: org.hibernate를 발생시켰다.NonUniqueObjectException: 동일한 식별자 값을 가진 다른 개체가 이미 세션 오류와 연결되어 있습니다.나중에 알게 된 것은 당신이 @GenerateValue to the GenerateId get 메서드를 가지고 있는지 확인하는 것 뿐입니다.
개체를 삭제할 때 이 문제가 발생했지만 제거 또는 클리어에 도움이 되지 않았습니다.
/**
* Deletes the given entity, even if hibernate has an old reference to it.
* If the entity has already disappeared due to a db cascade then noop.
*/
public void delete(final Object entity) {
Object merged = null;
try {
merged = getSession().merge(entity);
}
catch (ObjectNotFoundException e) {
// disappeared already due to cascade
return;
}
getSession().delete(merged);
}
반복 객체가 시작되는 위치 전에 세션을 닫고 새 세션을 시작해야 합니다.
session.close();
session = HibernateUtil.getSessionFactory().openSession();
따라서 동일한 식별자를 가진 엔티티는 1개의 세션에서1개만 존재하지 않습니다.
저도 비슷한 문제가 있었어요.는, 내, , the, , 는, the을 설정하는 것을 .increment_by
은 이 값이 .cache_size
★★★★★★★★★★★★★★★★★」allocationSize
Attribute의 Attribute의 Attribute의 Attribute의 Attribute의 Attribute를 가리킵니다).
SQL:
CREATED 26.07.16
LAST_DDL_TIME 26.07.16
SEQUENCE_OWNER MY
SEQUENCE_NAME MY_ID_SEQ
MIN_VALUE 1
MAX_VALUE 9999999999999999999999999999
INCREMENT_BY 20 <-
CYCLE_FLAG N
ORDER_FLAG N
CACHE_SIZE 20 <-
LAST_NUMBER 180
자바:
@SequenceGenerator(name = "mySG", schema = "my",
sequenceName = "my_id_seq", allocationSize = 20 <-)
파티에 늦었지만 다음 사용자에게 도움이 될 수 있습니다.
레코드를 선택했을 때 이 문제가 발생하였습니다.getsession()
동일한 세션을 사용하여 동일한 ID로 다른 레코드를 다시 업데이트하면 문제가 발생합니다.아래에 코드가 추가되었습니다.
Customer existingCustomer=getSession().get(Customer.class,1);
Customer customerFromUi;// This customer details comiong from UI with identifer 1
getSession().update(customerFromUi);// Here the issue comes
이 작업은 절대 수행하지 마십시오. 솔루션은 업데이트 전에 세션을 삭제하거나 비즈니스 로직을 변경하는 것입니다.
ID가 null인지 0인지 확인합니다.
if(offersubformtwo.getId()!=null && offersubformtwo.getId()!=0)
콘텐츠가 양식에서 Pojo로 설정된 추가 또는 업데이트에서
저는 NHibernate에 처음 왔습니다.제 문제는 저장하기 위해서와는 다른 세션을 사용하여 오브젝트를 문의했다는 것입니다.저장 세션은 개체에 대해 알지 못했습니다.
당연한 것 같습니다만, 앞의 답변을 읽고 나서, 2세션이 아닌 2개의 오브젝트를 찾아 헤맸습니다.
@GeneratedValue(전략=GenerationType).ID)에서 이 주석을 엔티티 bean의 프라이머리 키속성에 추가하면 이 문제가 해결됩니다.
이 를 해결했습니다.
실제로 이 문제는 bean 클래스에 PK 속성의 제너레이터 타입 구현을 잊어버렸기 때문에 발생합니다. 어떤 .
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
때, 가 같은 다른 되면 이 의 ID를 HIB Exception: org.hibernate.NonUniqueObjectException:
동일한 식별자 값을 가진 다른 개체가 세션에 이미 연결되어 있습니다.
이 문제는 동일한 휴지 상태 세션에서 동일한 ID로 두 개체를 저장하려고 하기 때문에 발생합니다.다음 두 가지 솔루션이 있습니다.
이는 다음과 같이 id 필드에 대해 mapping.xml 파일을 올바르게 설정하지 않았기 때문입니다.
<id name="id"> <column name="id" sql-type="bigint" not-null="true"/> <generator class="hibernateGeneratorClass"</generator> </id>
isSessionClear와 같은 매개 변수를 받아들이도록 getsession 메서드를 오버로드하고 다음과 같이 현재 세션을 반환하기 전에 세션을 클리어합니다.
public static Session getSession(boolean isSessionClear) { if (session.isOpen() && isSessionClear) { session.clear(); return session; } else if (session.isOpen()) { return session; } else { return sessionFactory.openSession(); } }
이로 인해 기존 세션오브젝트가 클리어 됩니다.또, 하이버네이션으로 일의의 식별자가 생성되지 않는 경우에도, Auto_와 같은 것을 사용해 프라이머리 키에 대해서 데이타베이스가 올바르게 설정되어 있는 것을 전제로 하고 있습니다.증액하면 효과가 있을 거야
wbdarby가 말한 것과 달리 HQL에 개체 식별자를 제공하여 개체를 가져올 때도 발생할 수 있습니다.오브젝트 필드를 수정하여 동일한 세션에서 DB에 다시 저장하려고 할 때(수정사항은 삽입, 삭제 또는 업데이트될 수 있음) 이 오류가 나타납니다.수정된 개체를 저장하거나 새 세션을 만들기 전에 휴지 상태 세션을 지우십시오.
가 도와줬으면
내 세트를 잭슨이 준 새 세트로 교체할 때와 같은 오류가 있습니다.
, , 「알 수 없는 를 「알 수 없는 요소」를 「알 수 없는 것」이라고 하는 합니다.retainAll
addAll
.
this.oldSet.retainAll(newSet);
this.oldSet.addAll(newSet);
세션을 가지고 조작할 필요가 없습니다.
이거 먹어봐.아래가 효과가 있었어요!
서서 hbm.xml
합니다.
dynamic-update
to " " 。true
:<class dynamic-update="true">
에 있는 태그의 클래스 를 unique 컬럼으로 합니다.
identity
:<generator class="identity">
을 ": 하음 note note : 하 、 [ ] 。identity
assigned
.
저도 같은 문제가 있었어요.다음 행을 추가하여 해결합니다.
@GeneratedValue(strategy=GenerationType.IDENTITY)
또 하나 효과가 있었던 것은 instance를 long 대신 long으로 만든 것입니다.
키 id, id로 , 본키 id 、 Long id 、 Long id 、 Long id 、 Long id 、 로 로 로 i i i i i i i 。
행운을 빌어요.
세션 플러시는 언제든지 실행할 수 있습니다.Flush는 세션 중인 모든 객체의 상태를 동기화하며(잘못된 경우 수정해 주십시오), 경우에 따라 문제를 해결할 수 있습니다.
독자적인 동등 및 해시 코드를 실장하는 것도 도움이 될 수 있습니다.
캐스케이드 설정을 확인할 수 있습니다.모델의 캐스케이드 설정이 원인일 수 있습니다.캐스케이드 설정(캐스케이드 삽입/업데이트는 기본적으로 허용되지 않음)을 삭제하여 문제를 해결했습니다.
이 에러도 발견했어요.프라이머리 키(자동 생성)가 PDT(롱, int 등)가 아니라 오브젝트(롱, 정수 등)인지 확인하는 것이 효과적이었다.
개체를 생성하여 저장할 때 0이 아닌 null을 전달해야 합니다.
언급URL : https://stackoverflow.com/questions/1074081/hibernate-error-org-hibernate-nonuniqueobjectexception-a-different-object-with
'programing' 카테고리의 다른 글
카운트(*)를 해야 하나요, 말아야 하나요? (0) | 2022.11.20 |
---|---|
실제로 Python 3.3에서 "유효율" 구문의 주요 용도는 무엇입니까? (0) | 2022.11.20 |
MySQL에서 열과 테이블 이름은 대소문자를 구분합니까? (0) | 2022.11.20 |
PyLint "가져올 수 없습니다" 오류 - PYTONPATH를 설정하는 방법 (0) | 2022.11.20 |
'Z' 리터럴이 있는 SimpleDateFormat 구문 분석 날짜 (0) | 2022.11.20 |