【问题标题】:How to get id after saved object in db in JPA?如何在 JPA 中的 db 中保存对象后获取 id?
【发布时间】:2016-11-03 17:16:42
【问题描述】:

我在保存 claimDetail 对象后获取 id 时遇到问题,然后获取该已保存对象的 id 将变为 0 。其实我想得到那个保存的对象ID。但它不会来。我没有与 JPA 合作。我已经创建了一个用于调度的 Spring Boot 应用程序。

这是我的 ClaimDetails.java 实体类:

@Entity
@Table(name = "claimtrans")
public class ClaimTrans {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

    claimDetail.setActive(1);
    claimDetail.setVersion(new Long(1));
    claimDetail.setCreatedBy(new Long(1));
    claimDetail.setCreatedDate(new Date());
    claimDetailService.saveClaimDetail(claimDetail);

int temp =claimDetail.getID()

温度为 0;

这是我的 JpaRepositoryFactory.java:

@Service
public class ClaimDetailService {

    private JpaRepositoryFactory jpaRepositoryFactory;

    @Autowired
    public ClaimDetailService(JpaRepositoryFactory jpaRepositoryFactory) {
        this.jpaRepositoryFactory = jpaRepositoryFactory;
    }

    @Transactional
    public void saveClaimDetail(ClaimDetail claimDetail) {
        JpaRepository<ClaimDetail, Long> mailAuditLogLongJpaRepository = jpaRepositoryFactory.getRepository(ClaimDetail.class);
        mailAuditLogLongJpaRepository.save(claimDetail);
    }

    public List<ClaimDetail> getAllClaimDetail() {
        JpaRepository<ClaimDetail, Long> mailAuditLogLongJpaRepository = jpaRepositoryFactory.getRepository(ClaimDetail.class);
        return mailAuditLogLongJpaRepository.findAll();
    }
}

这是我的 JPA 工厂。

@Component
public class JpaRepositoryFactory {

    @PersistenceContext
    private EntityManager entityManager;

    public <T> T getRepository(Class clazz) {
        notNull(clazz);
        notNull(entityManager);
        T crudRepository = (T) new SimpleJpaRepository(clazz, entityManager);
        return crudRepository;
    }
}   

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <start-class>org.sam.application.Application</start-class>
        <java.version>1.6</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>

谁能帮我解决这个问题?

谢谢 司坦苏

【问题讨论】:

  • 发布声明对象实体
  • @Deepanjan 我更新了我的问题
  • 那么调用了什么 SQL 呢?又名“调试的第 1 步”
  • 请注意:在某些数据库中,0 实际上是一个有效的自动生成 ID。你确定有问题吗?
  • 你不需要做那么多我会发布一个你可以使用JpaRepository的解决方案。

标签: mysql spring jpa spring-boot entitymanager


【解决方案1】:

JPA 规范不保证提供的实体对象在保存后会更新。要获取保存的 JPA 实体,您必须使用 save() 方法的返回值。例如,您的服务可以这样更改:

@Service
public class ClaimDetailService {
    ...
    @Transactional
    public ClaimDetail saveClaimDetail(ClaimDetail claimDetail) {
        JpaRepository<ClaimDetail, Long> mailAuditLogLongJpaRepository = jpaRepositoryFactory.getRepository(ClaimDetail.class);
        return mailAuditLogLongJpaRepository.save(claimDetail);
    }
    ...
}

您的示例代码将是:

claimDetail.setActive(1);
claimDetail.setVersion(new Long(1));
claimDetail.setCreatedBy(new Long(1));
claimDetail.setCreatedDate(new Date());
ClaimDetail savedClaimDetail = claimDetailService.saveClaimDetail(claimDetail);
int temp = savedClaimDetail.getID()

此外,虽然与您的问题没有直接关系,但您不需要按照您的方式创建 Spring Data 存储库。只需创建您自己的扩展 JPARepository 的接口。

【讨论】:

    【解决方案2】:

    编写一个配置类并执行类似的操作。使用 JpaRepository

    @Configuration
    public class ClaimDetailService {
    
    
    public interface ClaimDetailRepository extends JpaRepository<Claimtrans, String>{
        ClaimDetail findById(String id);
    }
    
        @Autowired
        ClaimDetailRepository claimDetailRepository;
    
        @Autowired
        public void save(){
            ClaimTrans claimDetail=new ClaimTrans();
            claimDetail.setId(UUID.randomUUID.toString());
             claimDetail.setActive(1);
            claimDetail.setVersion(new Long(1));
            claimDetail.setCreatedBy(new Long(1));
            claimDetail.setCreatedDate(new Date());
            claimDetailRepository.save(claimDetail);
    
        int temp =claimDetailRepository.findById(claimDetail.getId());
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2012-09-26
      • 1970-01-01
      • 2011-10-14
      • 2012-01-14
      相关资源
      最近更新 更多