カスタムオブジェクトのリストをフィールドの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>{}
これがなぜ持続しないのかわかりません。どんな助力も非常に高く評価されます。乾杯!
ヘイブライアン カスケードタイプはエンティティにのみ適用できますか? CandidateFieldは、Candidateテーブルの単一フィールドに格納されたJSONをモデル化するPOJOであり、独立したエンティティではありません。ありがとう! –
ああ、CandidateFieldが単なるPOJOであることを指摘してくれてありがとう。私は何とかそれを見落とした。しかし、メモリ内のデータベースを使用して、(おそらくJUnitと組み合わせて)テストケースを削除したい場合は、もう一度見てください。 – Brian