【问题标题】:How call JPA methods with Spring Boot?如何使用 Spring Boot 调用 JPA 方法?
【发布时间】:2018-12-01 10:30:17
【问题描述】:

我使用 spring Initializr 创建了一个 Spring Boot 项目,选择了 Web 和 JPA 依赖项。

我可以进行休眠调用,例如save() - 但是 JPA 方法(例如 persist()、merge())不可用。

//JpRepository.java

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface JpRepository extends JpaRepository<Jp, Long> {
}

//JpServiceImpl
import com.jp.jp.db.JpRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.*;

@Service
public class JpServiceImpl {

    @Autowired
    private JpRepository jpRepository;

    @Transactional
    public void readJp() {

        jpRepository.save(jp);   // is available
        jpRepository.merge(jp);  // this method is not available

    }
}

}

【问题讨论】:

    标签: spring-boot jpa spring-data-jpa


    【解决方案1】:

    Spring Data JPA in an abstraction layer over JPA,因此您应该使用save() 方法而不是EntityManagers merge()persist()。 Spring Data JPA 会为您做到这一点。看source code of SimpleJpaRepository save()

    @Transactional
    @Override
    public <S extends T> S save(S entity) {
            if (entityInformation.isNew(entity)) {
                em.persist(entity);
                return entity;
            } else {
                return em.merge(entity);
            }
    }
    

    【讨论】:

      【解决方案2】:

      因为CrudRepositoryJpaRepository 接口都没有merge 方法。

      您应该查看EntityManagermerge 方法。

      【讨论】:

        猜你喜欢
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 2018-10-22
        • 2018-05-22
        • 1970-01-01
        • 2016-09-18
        • 2017-09-02
        相关资源
        最近更新 更多