相关疑难解决方法(0)

Spring JpaRepository - 分离和附加实体

我正在使用spring boot并在jpa上休眠.我正在使用JpaRepository接口来实现我的存储库.与以下UserRepository一样

public interface UserRepository extends JpaRepository<User, Long> {
}
Run Code Online (Sandbox Code Playgroud)

我想实现以下目标

  1. 加载用户实体.
  2. 更改实体对象的状态,例如user.setName("foo")
  3. 进行外部系统Web服务调用.将呼叫结果保存在DB中
  4. 仅在成功响应此Web服务调用时,将新用户状态保存在存储库中.

以上所有步骤都不会发生在一个事务中,即外部服务调用不在事务中.

当我通过其存储库将我的Web服务结果保存在DB中时,我的用户实体更改也会保存.根据我的理解,这是由于在步骤#3中刷新了持久性上下文.在一些谷歌之后,我认为我可以实现我的目的,如果我可以在第一步分离我的用户实体并在步骤4重新连接它.请确认如果我的理解是正确的,我怎么能做到这一点?JpaRepository接口中没有用于分离实体的方法.

以下是代码来说明

public void updateUser(int id, String name, int changeReqId){
    User mUser = userRepository.findOne(id); //1
    mUser.setName(name); //2

    ChangeRequest cr = changeRequestRepository.findOne(changeReqId);
    ChangeResponse rs = userWebService.updateDetails(mUser); //3

    if(rs.isAccepted()){
        userRepository.saveAndFlush(mUser); //4
    }

    cr.setResponseCode(rs.getCode());
    changeRequestRepository.saveAndFlush(cr); //this call also saves the changes at step 2
}
Run Code Online (Sandbox Code Playgroud)

谢谢

java spring hibernate jpa spring-data-jpa

22
推荐指数
3
解决办法
4万
查看次数

javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给persist的分离实体

使用JPA和Hibernate,运行以下代码时出现异常.我第一次运行它,一切都很顺利,数据插入数据库.第二次,当数据应该更新时,它会失败:

@AdminTx
public void processSite(Site site) {
    FluxBoutiqueMapping mapping = mapper.generateMappingFromUrl(site);

    Boutique boutique;
    for (FluxBoutiqueMapping.Boutique fluxBoutique : mapping.getListe().getBoutiques()) {
        log.error("Dans la boucle");
        boutique = daoAdmin.namedQuerySingle(Boutique.LOAD_BOUTIQUE_BY_IDWEBSC, fluxBoutique.getId());
        log.error("boutique : "+boutique);

        if (boutique==null) {
            log.error("Dans le new");
            boutique = new Boutique();
        }

        boutique.setSite(site);
        boutique.setUrlLogo(fluxBoutique.getLogo());
        boutique.setUrlBoutique(fluxBoutique.getUrl());
        boutique.setSelected(false);
        boutique.setIdWebSC(fluxBoutique.getId());
        boutique.setDateModification(new Date());

        boutiqueDao.persist(boutique);

        boutique = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

boutiqueDao.persist()只是调用EntityManager.persist()方法.

在这里我的精品课:

@Entity
@Table(name = "BOUTIQUE")
@SequenceGenerator(name = "SEQ_BOUTIQUE", sequenceName = "SEQ_BOUTIQUE")
@NamedQueries(value = {
        @NamedQuery(name = Boutique.LOAD_BOUTIQUE_BY_IDWEBSC, query = "from Boutique b where b.idWebSC=?1"),
})
public …
Run Code Online (Sandbox Code Playgroud)

java persistence hibernate jpa

21
推荐指数
2
解决办法
7万
查看次数

避免在Spring中为TImeline功能创建重复项

我正在开发一个Spring-MVC项目,我目前正在使用Timeline功能.我有一个基本的基础设施正在进行中,但目前,我正在处理映射,以及如何避免为时间轴功能创建重复项.

情况:

在我们的工具中,有GroupSection,它与GroupNote具有一对多的映射.GroupNote对象具有"附件","历史记录"的一对多映射.

这个时间线功能是什么?

在时间轴功能中,任何用户都可以在任何时间点跳转并检查GroupSection,GroupNotes,附件和历史记录的内容.

我打算如何实施它?

我在上述每个对象中都有4个变量来处理它.它们是Date SavedDate,boolean initialNote,boolean noteModified,boolean latestNote.

除此之外,每个GroupNote都有一个自我加入,很快就会解释它.

现在,每次修改注释时,修改后的标志都设置为true.在晚上,我运行一个方法,它检查所有修改过的对象,并且只有在修改了对象时,它才会为Object创建一个重复的实例,将新的Date放入其中,将其标记为最新的,并保留它.

这样,我可以加载给定日期的所有对象.对于正常的日常使用latest,将加载所有标记为的笔记.

每当为持久性创建一个新对象时,它就会与旧对象自行连接Cascade.Remove.这样做的是,如果用户返回并从2015年移除对象,则所有后续对象也将被删除.这给了时间就像行为.

问题:

现在,如果修改了GroupSection,那么我将创建一个GroupSection实例并通过从修改后的GroupSection复制属性来保留它,并将其标记为最新.

现在,GroupSection持有的Notes没有被修改,但是如果我不创建它的重复条目,那么我将不会在前端看到任何Notes加载.但我想避免这种情况.我怎样才能做到这一点?

最后代码:

GroupSection模型:

@Entity
@Table(name = "membersection")
public class GroupSection {

@Column(name = "section_save_date", columnDefinition = "date")
    private Date secnSavedDate;

    @Column(name = "initial_section", columnDefinition = "boolean default true")
    private boolean initialSection;

    @Column(name = "section_modified", columnDefinition = "boolean default false")
    private boolean sectionModified;

    @Column(name = "latest_section", columnDefinition = "boolean default false")
    private …
Run Code Online (Sandbox Code Playgroud)

java mapping spring hibernate spring-mvc

11
推荐指数
1
解决办法
281
查看次数