エンティティをネストされたエンティティのセットでロードしたいとします。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のアノテーションを持つクラスは、トランザクションのアスペクトでラップされるべきであると春を告げる:
Fetch.EAGERと同じ問題が発生しています。私は父親の子供のリストに私が作成した新しい子供は見ません。私は彼を見るためにサーバーを再起動する必要があります。 – user1260928
上記で貼り付けたコードから、私はそれが子オブジェクトを個別に保存しているが、同じものを返すことはできないことを理解しました。私が間違っているなら、私を訂正してください。そして、別のコントローラから子供を保存する場所(通常はDAOImplで書かれているコードを保存する)にコードを貼り付けることができれば、問題を見つけるのに役立ちます。 – Anurag
新しいFatherオブジェクトを作成します(例えばupdatedFather = ownerRepository.findOne(id);)。その後、DBから取得して同じものを返します。 – Anurag