【发布时间】:2021-03-16 09:50:25
【问题描述】:
我正在从 FB 营销 API 获取数据并尝试保存在数据库中。我可以使用CrudRepository 或JpaRepository -> saveall 方法将数据保存在数据库中,但是当尝试获取id 以响应saveall 时,我得到id 为空。当我在h2-console 中看到时,能够看到事务完成后的自动增量值。
注意:id 不用作主键@Id。 accountId 用作主键。
型号:
@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<Account, Long> 和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