Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JPA-持久化嵌套对象_Spring_Jpa_Spring Data Jpa_Repository - Fatal编程技术网

Spring JPA-持久化嵌套对象

Spring JPA-持久化嵌套对象,spring,jpa,spring-data-jpa,repository,Spring,Jpa,Spring Data Jpa,Repository,我有一个简单的JPA存储库,如下所示: public interface UserRepository extends JpaRepository<User, String> { User findByName(String name); } @Entity public class User { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", stra

我有一个简单的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;

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

现在,我知道我可以很容易地编辑和保存这样的用户实例:

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;

    //...
}
User user = userRepository.findByName("Alice");
PlayerCharacter character = user.getPlayerCharacter();
character.setCharacterName("ConanTheBarbarian");
userRepository.save(user);
但是,在没有指向
用户
实例的指针的上下文中,如何持久化
玩家角色
实例,f.I.:

public void changePlayerCharacterName(PlayerCharacter character, String name){
    character.setCharacterName(name);
    // How to correctly persist the 'character' instance here?
}
我可以直接调用
userRepository.save(字符)吗


我是否需要自动连接另一个存储库(
PlayerCharacterRepository
)并对其调用.save()?

首先,您不会使用UserRepository,而是使用PlayerCharacterRepository


但即便如此,JPA的基本原则是,它自动使对受管实体所做的更改保持不变。因此,您不需要调用save()。您只需获取一个托管玩家角色(使用find(),或通过关联导航,或使用查询),然后更改其名称。这就是您所需要的。

以这种方式进行双向映射

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


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

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

如果海报不是JPA的一部分,您为什么建议海报使用一些专有注释
@LazyCollection
?!通过这种方式,您可以进行双向映射。假设所有这些都发生在一个事务
userRepository中。保存
是多余的。