2014-03-12 2 views
0

누군가가이 문제를 해결할 수 있기를 바랍니다. 스프링과 JPA를 사용하여 데이터를 저장하고 있습니다. DAO 호출을 저장하려고 할 때 모든 데이터가 저장되는 것은 아닙니다.스프링에서 데이터 업데이트/저장 JPA

는 기본적으로 어떻게됩니까

class User 
var name 
var surname 

@OneToMany(mappedBy = "rule",cascade = CascadeType.PERSIST) 
@Fetch(FetchMode.SUBSELECT) 
set<Address> address; 

@OneToMany(mappedBy = "rule",cascade = CascadeType.PERSIST) 
@Fetch(FetchMode.SUBSELECT) 
set<Job>job; 


class Address 
List<AddressList>addressList; 

class Job 
List<JobList>jobList; 

내가 주소 또는 작업 클래스에 관련된 변경하는 경우 이름과 성 (姓) 변경하지만, 이러한 노력하지 않는 것입니다 다음과 같은 구조를 고려하십시오. 그러나 사용자를 삭제하면 작동합니다. 사용자 정보 (주소, 작업)를 검색하면 올바르게 검색됩니다.

문제점에 대한 조언이 있으십니까?

+0

귀하의 주소 또는 직업 테이블은 읽기 전용 일 수 있습니다. defenetely 나는 어떤 오류 또는 예외를 얻고 있습니까? –

+0

몇 가지 변경을가했지만 다음과 같은 오류가 발생했습니다 : org.hibernate.TransientObjectException : 개체가 저장되지 않은 일시적인 인스턴스입니다 - 병합하기 전에 일시적 인스턴스 저장 집합 cascadeType이 Persist로 설정된 경우이 문제가 발생합니다. 내가 Merge 또는 ALL로 설정했다면 오류는 없지만 cascadeType.MERGE 사용에 대한 조언에 대한 이전 코멘트에서 설명한 것처럼 모든 자식 요소가 삭제됩니다. – cpu2007

답변

0

지속 작업 만 계단식 연결입니다. 이미 지속 된 엔티티를 업데이트하면 병합 작업이 수행됩니다. 따라서 병합 작업을 캐스 캐 이드하는 것이 좋습니다 : CascadeType.MERGE 업데이트시 관련 엔터티도 저장하려면.

+0

@OneToMany (mappedBy = "rule", cascade = CascadeType.PERSIST) to @OneToMany (mappedBy = "rule", cascade = CascadeType.MERGE) 하지만 이제는 데이터가 저장되지 않고 삭제되는 경우가 있습니다. 사용자가 1 명이고 2 jobs 추가 주소를 추가했는데 두 작업이 사라졌고 추가 주소가 추가되지 않았지만 거기에 있었던 주소는 여전히 남아 있습니다. – cpu2007

0

캐스케이드 유형 모두를 시도하십시오 --- CascadeType.ALL. 고아 제거에 대한

당신은 사용해야

CascadeType.DELETE_ORPHAN을 - 당신은 최대 절전 모드 사용하는 경우

orphanRemoval = 진실 - 당신은 JPA 2.0을 사용하는 경우

수동 제거 - 경우 해당 사항 없음 적용

0

귀하의 일시적 개체 decalre가 있습니까 @Transient? 확인 BTW - 단계 아래

follw :

  1. @Transient

  2. 사용 캐스케이드 유형의 모든 --- CascadeType.ALL로 teansient 객체를 선언합니다.

  3. entityManager.flush()을 사용하여 entitymanager를 플러시 한 다음 persist() 또는 merge() 작업을 수행하십시오.