2016-06-13 12 views
3

私はこのようになりますシンプルなJPAリポジトリを持っています。春JPA永続ネストされたオブジェクト

@Entity 
public class PlayerCharacter 
{ 
    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    protected String uuid; 

    @OneToOne(optional = true) 
    private User user; 

    @Column(nullable = false) 
    private String characterName; 

    //... 
} 

は今、私は簡単にこのようなユーザーインスタンスを編集し、存続できることを知っている:

User user = userRepository.findByName("Alice"); 
PlayerCharacter character = user.getPlayerCharacter(); 
character.setCharacterName("ConanTheBarbarian"); 
userRepository.save(user); 

しかし、どのように私は私が持っていないコンテキスト内からPlayerCharacterインスタンスを永続化するだろうバックUserインスタンスへのポインタは、FI:

public void changePlayerCharacterName(PlayerCharacter character, String name){ 
    character.setCharacterName(name); 
    // How to correctly persist the 'character' instance here? 
} 

は、私はちょうどuserRepository.save(character);を呼び出すことができますか?

別のリポジトリ(PlayerCharacterRepository)をautowireし、その上で.save()を呼び出す必要がありますか?

答えて

1

まず、UserRepositoryではなく、PlayerCharacterRepositoryを使用します。

でも、JPAの基本原則は、です。自動的には、管理対象エンティティに対する変更を永続化します。したがって、save()を呼び出す必要はありません。あなたは管理されたプレイヤーキャラクター(find()を使用するか、関連付けをナビゲートする、または照会を使用する)を取得し、その名前を変更します。それだけで十分です。

0

このように双方向マッピングを行います。

@OnetoOne 
@LazyCollection(LazyCollectionOption.FALSE) 
private PlayerCharacter playerCharacter; 


@OneToOne(fetch=FetchType.EAGER) 
private Status status; 

このタイプのマッピングでは、UserRepositoryとPlayerCharacterRepositoryの両方を使用して両方のインスタンスを保持できます。

+1

JPAの一部ではないときに、ポスターが独自の注釈@ @ LazyCollection'を使用することをなぜお勧めしますか? –

+0

これにより、双方向マッピングが可能です。 – Deepanjan

関連する問題