2017-12-02 2 views
0

オブジェクト。タグは次のようになります。春ブーツカスタムの配列とJSONシリアル化カスタムオブジェクトは、このクラスがある

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private long id; 
private long activityId; 
private String keyword; 

public Tag(String keyword){ 
    this.keyword = keyword; 
    activityId = -1; 
} 

ActivityTagの両方がEntitysであり、また両方Repositorysを持っている:

public interface TagRepository extends CrudRepository<Tag, Long> { 

} 

public interface ActivityRepository extends CrudRepository<Activity, Long> { 

} 

これは作成あり - データベースにActivityオブジェクトを格納する方法:

@PostMapping 
    public Activity create(@RequestBody Activity input) { 
     if(input.getTags() != null) { 
      for(Tag t : input.getTags()) { 
       t.setActivityId(input.getId()); //associate which activity has which tags 
       tagRepository.save(t); 
      } 
     } 

     return activityRepository.save(input); 
    } 
は、

POST経由でこのJSONを送信します。

{ 
    "key":2, 
    "text":"Hello", 
    "tags":[{ 
     "keyword":"h" 
    },{ 
     "keyword":"b" 
    } 
    ], 
    "title":"world" 
} 

しかし、私はこのエラーを取得する:どちらのクラスもゲッター/各メンバ変数のためのセッターとの両方のデフォルトのctorsを持っている

​​

、私はできるだけ短い質問を保つために、ここでそれらを示しませんでした。

+0

@OneToManyタグ属性に注釈を付けますか? – Mick

+0

私は以下を取得します: 'org.hibernate.AnnotationException:リスト/配列に@OrderColumn(または@IndexColumn):base.Activity.tags'というアノテーションを付ける必要があります – binaryBigInt

答えて

1

まず、アクティビティとタグの間の関係を作成する必要があります。アクティビティーには多数のタグがあり、関係はoneToManyでなければなりません。

http://www.baeldung.com/hibernate-one-to-many

@Entity 
@Table(name="ACTIVITY") 
public class Activity { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 
    private int key; 
    private String text; 

    @OneToMany(mappedBy="activity") 
    private List<Tag> tags; 

    private String title; 
    private boolean valid; 
    public Activity(int key, String text, List<Tag> tags, String title) { 
    this.key = key; 
    this.text = text; 
    this.tags = tags; 
    this.title = title; 
    valid = true; 
    } 
} 

@Entity 
@Table(name="TAG") 
public class Tag { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 

    @ManyToOne 
    @JoinColumn(name="activity_id", nullable=false) 
    private Activity activity; 

    private String keyword; 

    public Tag(String keyword){ 
    this.keyword = keyword; 
    activityId = -1; 
    } 
} 

あなたが手動でタグエンティティの保存を処理することを意味プロパティCASCADE.ALLを使用していないすべての最初の。

@PostMapping 
    public Activity create(@RequestBody Activity input) { 
     if(input.getTags() != null) { 
      //you are saving all the nested tags manually before saving the activity 
      for(Tag t : input.getTags()) { 
       tagRepository.save(t); 
      } 
     } 
     //now you are saving activity which contains these tags 
     return activityRepository.save(input); 
    } 
関連する問題