2016-08-22 80 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