2016-08-22 13 views
1

カスタムオブジェクトのリストをフィールドの1つとして持つJPAエンティティを持っています。ジャクソンのコンバーターを使用して、このリストをJSON配列としてMySQLデータベースに保存することができましたが、Iamは最初の作成後にこのリストに挿入できません。リストをJSON配列にシリアライズ

既存のリストを正常に取得し、新しいオブジェクトをメモリに追加し(挿入されていることをテストして)、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クラスの内部リストと

候補エンティティ:ここに私のコードは、(これはFYI春ブートプロジェクトである)です。 CandidateFieldは、Candidateテーブルの単一フィールドに格納された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

ヘイブライアン カスケードタイプはエンティティにのみ適用できますか? CandidateFieldは、Candidateテーブルの単一フィールドに格納されたJSONをモデル化するPOJOであり、独立したエンティティではありません。ありがとう! –

+0

ああ、CandidateFieldが単なるPOJOであることを指摘してくれてありがとう。私は何とかそれを見落とした。しかし、メモリ内のデータベースを使用して、(おそらくJUnitと組み合わせて)テストケースを削除したい場合は、もう一度見てください。 – Brian

関連する問題