2016-08-22 124 views
1

我有一個JPA實體,其自定義對象列表作爲其字段之一。使用Jackson轉換器,我設法將此列表作爲JSON數組存儲到MySQL數據庫中,但Iam無法在其初始創建後插入此列表。將列表序列化爲JSON數組

我可以成功檢索現有列表,在內存中添加一個新對象(並測試它是否已插入),然後通過Spring REST存儲庫保存它。然而,它似乎永遠不會持續下去。有任何想法嗎?這裏是我的代碼(這是一個春天啓動項目FYI):內

@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只是一個POJO,它模擬存儲在Candidate表中單個字段中的JSON,它不是一個獨立的實體。

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

嘿布萊恩, 級聯類型只適用於實體他們不是? CandidateField只是一個POJO,它模擬存儲在Candidate表中單個字段中的JSON,它不是一個獨立的實體。謝謝! –

+0

哦,謝謝你指出CandidateField只是一個POJO。我不知何故忽略了它。但是,如果您願意提供一個精簡的測試用例(可能與JUnit結合)並使用內存數據庫,我很樂意再看看它。 – Brian