2016-06-15 3 views
1

エンティティをネストされたエンティティのセットでロードしたいとします。Spring/J2EE:エンティティとその子を取得する

エンティティ父

@OneToMany(mappedBy = "father") 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@chilId") 
    private Set<Child> children = new HashSet<>(); 

エンティティ子供

@ManyToOne 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@fatherId") 
    private Father father; 

をSpring MVCの残りのコントローラでは、私は父をロードしています:ここに は私が行う方法です。私は父をデバッグする場合

@RequestMapping(value = "/fathers/{id}", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    @Transactional(readOnly = true) 
    public ResponseEntity<Father> getLot(@PathVariable Long id) { 
     Father father = fatherRepository.findOne(id); 
     return Optional.ofNullable(father) 
      .map(result -> new ResponseEntity<>(
       result, 
       HttpStatus.OK)) 
      .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); 
    } 

Father father = fatherRepository.findOne(id);した後、私はその子を取得しています、それは大丈夫です。

しかし、私は(別の春コントローラに)私のデータベースに子を追加する場合:

@RequestMapping(value = "/children", 
     method = RequestMethod.POST, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    @Transactional 
    public ResponseEntity<Child> createStock(@RequestBody Child child) throws URISyntaxException { 
     if (child.getId() != null) { 
      return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert("child", "idexists", "A new child cannot already have an ID")).body(null); 
     } 
     Child result = stockRepository.save(child); 
     return ResponseEntity.created(new URI("/api/stocks/" + result.getId())) 
      .headers(HeaderUtil.createEntityCreationAlert("child", result.getId().toString())) 
      .body(result); 
    } 

そして私は父のエンティティをロードした場合、私はこの父親のために作成した新しい子を取得しておりません。
@transactionnalアノテーションとは関係がありますが、私は何も見ません。

[UPDATE] 私は自分が望むものを手に入れました。 は、以下のように実行すると動作します:

Father father = ownerRepository.findOne(id); 
Child child= new Car(); 
child.setFather(father); 
child = carrepository.save(child); 
father.getChildren().add(child); 
father = ownerRepository.save(father); 
father = ownerRepository.findOne(id); 

私はそれを行う場合:

Father father = ownerRepository.findOne(id); 
Child child= new Car(); 
child.setFather(father); 
child = carrepository.save(child); 
father = ownerRepository.findOne(id); 

を、私は子供を保存した後に父親を取得するとき、私は父のオブジェクトで新しい子を得ることはありません。 @EnableTransactionManagement @Transactionalのアノテーションを持つクラスは、トランザクションのアスペクトでラップされるべきであると春を告げる:

答えて

0

私はトランザクションがコミットまたは

をフラッシュされていないので、それはだと思うが上の表情を持っています。これで@Transactionalは使用できるようになりました。

0

父親のエンティティでFetchType.EAGERを使用してください。これは、あなたが父親のエンティティを取得するときに、子をロードします。これがあなたを助けることを願って!

+0

Fetch.EAGERと同じ問題が発生しています。私は父親の子供のリストに私が作成した新しい子供は見ません。私は彼を見るためにサーバーを再起動する必要があります。 – user1260928

+0

上記で貼り付けたコードから、私はそれが子オブジェクトを個別に保存しているが、同じものを返すことはできないことを理解しました。私が間違っているなら、私を訂正してください。そして、別のコントローラから子供を保存する場所(通常はDAOImplで書かれているコードを保存する)にコードを貼り付けることができれば、問題を見つけるのに役立ちます。 – Anurag

+0

新しいFatherオブジェクトを作成します(例えばupdatedFather = ownerRepository.findOne(id);)。その後、DBから取得して同じものを返します。 – Anurag

関連する問題