当前位置: 首页 > 知识库问答 >
问题:

spring JPA-持久化嵌套对象

夏炎彬
2023-03-14

我有一个简单的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实例,f.I.:

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

我可以只调用userRepository.save(character);吗?

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

共有1个答案

池阳伯
2023-03-14

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

但即便如此,JPA的基本原则是,它自动地使对托管实体所做的更改持久化。所以不需要调用save()。您只需获得一个托管播放器字符(使用find(),或通过在关联中导航,或通过使用查询),并更改其名称。这就是你所需要的。

 类似资料:
  • 我有一个名为的类,它有一个狗的列表: 狗类有一个小狗列表: 当我试图创建一个新的人类,它有一只狗,狗又有一只小狗,并且我使用带有spring的Hibernate JPA存储库来保存人类时: 我得到以下错误: 但是,如果我用默认值创建人类,并用人类存储库保存他,它就能工作,并且保存了小狗。 我不明白为什么小狗没有自动保存,我也不想使用一个单独的存储库来保存小狗。当狗定义时,Hibernate不应该自

  • 我确实有两个实体,称为学校和水平,具有多对多的关系。 我的Rest controller有一个create方法,它接受一个SchoolDTO(目前它的结构与实体相同)。 当我试图通过JPARepository保存方法保存时,会抛出一个包含以下消息的异常: 通过遍历每个级别Id来解决这个问题...使用JPA存储库方法(它调用)获取引用,然后加载正确的模型,然后成功持久化。 我的问题是:这是在Spri

  • Hibernate 认为持久化类(persistent class)新实例化的对象是瞬时(Transient)的。我们可通过将瞬时(Transient)对象与 session 关联而把它变为持久的(Persistent)。 DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex('M');

  • 谢谢 ----更新----

  • Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重

  • 我遇到了一个问题,在我的JPA表中没有任何内容被持久化。据我所知,我想我理解了的基本思想。我猜出现问题的原因是,我在一个可嵌入的对象中有一个。 一个简单的例子: 有什么线索表明可能出了什么问题吗? 为了简洁起见,我将尽量使附加信息尽可能简短。 创建计算原因 创建计算历史记录 调试信息在计算历史#创建 HibernateDAO仓库 Hibernate生成的SQL 看起来HiberNate甚至没有生成