Spring JPA - 持久化嵌套对象

5

我有一个简单的JPA存储库,看起来像这样:

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

还有两个具有一对一映射关系的类,就像这样:

@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);

但是在没有指向User实例的指针的上下文中,我如何持久化一个PlayerCharacter实例,例如:

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

我是否可以只调用userRepository.save(character);

还是需要自动装配另一个仓库 (PlayerCharacterRepository) 并调用.save()方法吗?


假设所有这些操作都在一个事务中进行,userRepository.save 是多余的。 - Jens Schauder
2个回答

3

首先,你不会使用UserRepository,而是使用PlayerCharacterRepository。

即使如此,JPA的基本原则是它自动将对托管实体的更改持久化。因此,您无需调用save()方法。您只需要获取托管的角色(使用find()方法,通过关联导航,或使用查询),然后更改其名称。这就是您所需要的全部。


0

可以这样创建双向映射。

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


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

通过这种映射方式,您可以使用UserRepository和PlayerCharacterRepository来持久化这两个实例。

1
为什么您会建议海报使用一些专有的注释“@LazyCollection”,而它并不是JPA的一部分呢?! - Neil Stockton
通过这种方式,您可以实现双向映射。 - Deepanjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接