【问题标题】:Spring data jpa CRUDRepository/ JPArepository saveall can not get id (non primary key)Spring data jpa CRUDRepository/ JPArepository saveall 无法获取id(非主键)
【发布时间】:2021-03-16 09:50:25
【问题描述】:

我正在从 FB 营销 API 获取数据并尝试保存在数据库中。我可以使用CrudRepositoryJpaRepository -> saveall 方法将数据保存在数据库中,但是当尝试获取id 以响应saveall 时,我得到id 为空。当我在h2-console 中看到时,能够看到事务完成后的自动增量值。

注意id 不用作主键@IdaccountId 用作主键。

型号:

@Entity
@Table(name = "accounts")
@Data
@ToString(onlyExplicitlyIncluded = true)
public class Account implements Serializable{
    @JsonIgnore
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(columnDefinition = "integer auto_increment",insertable = false)
    private Long id;

    @JsonProperty("account_id")
    @Column(name = "account_id")
    @Id
    private String accountId;

    @Column(name = "account_status")
    private int accountStatus;
    @JsonProperty("timezone_id")
    @Column(name = "timezone_id")
    private int timezoneId;
    private int timezoneOffsetUtc;
    private String currency;
    @Column(name = "timezone_name")
    @JsonProperty("timezone_name")
    private String timezoneName;
    private String name;

    @Column(name = "created_on",nullable = false, updatable = false)
    @CreationTimestamp
    private LocalDateTime createdOn;

    @Column(name = "updated_on")
    @UpdateTimestamp
    private LocalDateTime updatedOn;
}

存储库:

@Repository()
public interface AccountRepository extends CrudRepository<Account, String> {
}

在保存后也尝试使用JpaRepository&lt;Account, Long&gt;flush..但在saveall() 的返回列表响应中仍然得到id null

服务:

@Service
public class AccountsService {
    @Autowired
    private AccountRepository repository;
   

    @Override
    @Transactional
    public List<Account> saveAll(List<Account> accounts) {
     //in case of JpaRepository
         List<Account> savedAccounts= repository.saveAll(accounts);
         repository.flush();
         return savedAccounts;
     //in case of CrudRepository
       return (List<Account>)repository.saveAll(accounts);
    }

}

执行时

//accountsList received from FB API
List<Account> savedList=iAccountsService.saveAll(accountsList);
savedList.get(0).getId() **//this is coming as null**

感谢任何形式的帮助。

【问题讨论】:

  • 可能与@JsonIgnore有关? insertable = false?毕竟你打电话给saveAll()
  • @OriDar @Jsonignore 用于来自杰克逊的对象-json 映射,即使在删除 insertable=false 之后我也遇到了同样的问题。
  • 如果我用@Id 注释id 它可以工作,但对于我的用例,我希望account_id 成为主键。我认为对于非主键自动生成似乎存在一些问题。
  • @GeneratedValue 与主键一起使用。 GeneratedValue 提供主键值的生成策略规范。

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


【解决方案1】:

在您的实体类中:

使用这个@GeneratedValue(strategy = GenerationType.IDENTITY)

public class Account implements Serializable{

    @JsonIgnore
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false, insertable = false, updatable = false)
    private Long id;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2020-02-09
    • 2017-01-31
    • 2018-08-15
    • 2019-01-14
    • 2023-03-23
    相关资源
    最近更新 更多