2016-06-13 104 views
3

我有一个简单的JPA存储库,看起来像这样:春天JPA - 坚持嵌套对象

public interface UserRepository extends JpaRepository<User, String> 
{ 
    User findByName(String name); 
} 

和两个类,有一个OneToOne映射,像这样:

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

    @Column(nullable = false, unique = true) 
    private String name; 

    @Column(nullable = false) 
    private String email; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user") 
    private PlayerCharacter playerCharacter; 

    //... 
} 

。现在

@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情况下,网络连接:

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

以这种方式进行双向映射。

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


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

通过这种类型的映射,您可以同时使用UserRepository和PlayerCharacterRepository来同时存在两个实例。

+1

为什么你会建议海报在不是JPA的一部分时使用一些专有注释'@ LazyCollection'? –

+0

通过这个你可以有双向映射。 – Deepanjan