2016-08-22 2 views
1

사용자 정의 객체 목록이 필드 중 하나로있는 JPA 엔티티가 있습니다. 잭슨 변환기를 사용하여이 목록을 JSON 배열로 유지하면서 MySQL 데이터베이스에 저장했지만 Iam은 초기 생성 후이 목록에 삽입 할 수 없습니다.JSON Array에 대한 목록 직렬화

기존 목록을 성공적으로 검색하고, 메모리에 새 객체를 추가 한 다음 (삽입되어 있는지 테스트) Spring REST 저장소를 통해 저장할 수 있습니다. 그러나 결코 지속되지 않는 것처럼 보입니다. 어떤 아이디어? 위의 목록을 구성하는

@Entity 
@Table(name = "Candidates", schema = "Candidate") 
public class Candidate extends ResourceSupport { 

@Id 
@Column(name = "CandidateID") 
private Long candidateID; 

// More fields 

@Column(name = "Fields") 
@Convert(converter = CustomConverter.class) 
private List<CandidateField> fields; 

//Getters & setters 
} 

CandidateField 클래스 내부 목록에

후보 개체 : 여기에 내 코드 (이 참고 봄 부트 프로젝트)입니다. CandidateField는 후보 테이블의 단일 필드에 저장된 JSON을 모델링하는 POJO이며 독립적 인 엔티티는 아닙니다. 데이터베이스에 계속

public class CandidateField { 

private Long fieldID; 
private String name; 
private boolean current; 

public CandidateField() { 

} 

public CandidateField (Long fieldID, String name, boolean current) { 
    this.fieldID = fieldID; 
    this.name = name; 
    this.current = current; 
} 

//Getters & Setters 
} 

변환기

public class CollectionConverter implements AttributeConverter<List<CandidateField>, String> { 

private ObjectMapper objectMapper = new ObjectMapper(); 

@Override 
public String convertToDatabaseColumn(List<CandidateField> object) { 
    try { 
     return objectMapper.writeValueAsString(object); 
    } catch (JsonProcessingException e) { 
     e.printStackTrace(); 
     return ""; 
    } 
} 

@Override 
public List<CandidateField> convertToEntityAttribute(String data) { 
    try { 
     return objectMapper.readValue(data, new TypeReference<List<CandidateField>>() {}); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

코드

public void addField(Long fieldID, Long candidateID) { 
    Candidate candidate = repository.findOne(candidateID); 
    candidate.getFields().add(new CandidateField(fieldID, "", true)); 
    repository.saveAndFlush(candidate); 
} 

저장소

@RepositoryRestResource 
public interface CandidateRepository extends JpaRepository<Candidate,Long>{} 

왜 이것이 지속되지 않는지 알 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 건배!

답변

0

컬렉션에 cascade type을 정의하는 것이 좋습니다.

Candidate 개체를 유지할 때 기본적으로 작업이 계단식으로 연결되지 않으므로 CandidateField 개체를 직접 유지하지 않으면 사용자가 직접 정의해야합니다.

+0

안녕하세요 Brian, 계단식 유형은 엔티티에만 적용 가능합니까? CandidateField는 후보 테이블의 단일 필드에 저장된 JSON을 모델링하는 POJO이며 독립적 인 엔티티는 아닙니다. 감사! –

+0

오, CandidateField가 단지 POJO라는 것을 지적 해 주셔서 감사합니다. 나는 어떻게 든 그것을 간과했다. 그러나 메모리 데이터베이스가있는 테스트 케이스 (JUnit과 함께)를 제공하려는 경우, 다시 한 번 살펴 보겠습니다. – Brian