【问题标题】:spring - CrudRepository and beans with transient fieldsspring - CrudRepository 和具有瞬态字段的 bean
【发布时间】:2016-11-16 05:44:56
【问题描述】:

我有一个用于持久化实体的 Spring CrudRepository。但是,我的实体有一些我不想存储在数据库中的临时字段,但是,我不想在调用 save() 时丢失它们,但似乎我总是从保存中得到一个全新的、不同的对象() 方法。因此我失去了我的瞬时值。

如果我不使用返回的对象并继续使用我调用 save() 的原始对象,我只能调用 save() 一次,否则它会抱怨实体已被另一个会话更新.

知道如何让 save() 将我的同一个对象返回给我吗?我应该使用不同的存储库吗?我可以添加一些注释来改变行为吗?

@Override
@Transactional
public TestRun saveTestRun(TestRun run) 
{
    logger.debug("Saving TestRun with Id: " + run.getId() + " " + run.toString());
    logger.debug("Timeout 1: " + run.getTimeout());
    run.setTimeout(10000000);  // set transient field

    logger.debug("Timeout 2: " + run.getTimeout());
    TestRun r2 = this.repository.save(run);

    logger.debug("Timeout 3: " + r2.getTimeout());

    logger.debug("Saved TestRun with Id: " + r2.getId() + " " + r2.toString() );

    return r2;
}

这会产生:

Saving TestRun with Id: 2 TestRun@4c4d810e
Timeout 1: 90
Timeout 2: 10000000
Payload no-arg constructor
TestRun constructor
TestRun no-arg constructor
Timeout 3: 90
Saved TestRun with Id: 2 TestRun@25a14d5c

【问题讨论】:

    标签: java spring hibernate spring-boot


    【解决方案1】:

    知道如何让 save() 将我的同一个对象返回给我吗?

    save(object) 将只返回生成的identifier 而不是您传递给它的对象。 所以得到save方法返回的identifier,然后如果你需要那个id,手动将它设置为对象。

    【讨论】:

      【解决方案2】:

      如果我不使用返回的对象并继续使用我的 我调用 save() 的原始对象,我只能调用 save() 一次,否则它会抱怨实体已被另一个更新 会话。

      您可以使用saveOrUpdate(Object object) 方法(Hibernate session),如果您想在多个会话中使用相同的实体对象,或者另一个选项是使用persist()(返回类型void),但使用@ 987654327@(生成的id不会返回),可以看here

      您可以在 here 中查找 session API。

      【讨论】:

      • 好的 - 所以我正在使用 org.springframework.data.repository.CrudRepository 与 Hibernate 进行交互。所以我很清楚,它没有持久化方法,所以我需要直接处理休眠会话并执行保存和/或持久化方法?尽可能地尝试使用 Spring 提供的开箱即用的框架,但如果我需要与 Hibernate 会话对话,我可以。
      猜你喜欢
      • 2016-01-28
      • 2018-09-23
      • 2012-02-10
      • 1970-01-01
      • 2016-01-29
      • 2011-06-01
      • 2022-01-15
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多