2016-06-13 4 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)를 자동 응답해야하고 .save()를 호출해야합니까?

답변

1

우선, UserRepository가 아니라 PlayerCharacterRepository를 사용합니다.

그러나 심지어 JPA의 근본 원칙은 입니다. 자동으로은 관리 대상에 대한 변경 사항을 영구히 유지합니다. 따라서 save()를 호출 할 필요가 없습니다. 관리되는 플레이어 캐릭터 (find()를 사용하거나 연관을 탐색하거나 쿼리를 사용하여)를 가져 와서 이름을 변경하면됩니다. 그게 당신이 필요한 전부입니다.

0

이러한 방식으로 양방향 매핑을 만듭니다. 당신이 UserRepository 및 PlayerCharacterRepository 모두 인스턴스를 모두 유지하는 데 사용할 수있는 맵핑의 유형으로

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


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

.

+1

포스터가 JPA의 일부가 아닌데 왜 독점적 주석'@ LazyCollection'을 사용한다고 제안 하시겠습니까? –

+0

이것으로 양방향 매핑을 할 수 있습니다. – Deepanjan