JPA - 保存后自动生成的字段为空

Tal*_*Mir 5 spring hibernate jpa spring-mvc spring-boot

我有一个Account实体,我正在尝试使用save函数来保存它。我的代码:

@Override
public Account createAccount(String pin) {

    Account account = new Account();
    account.setBalance(0L);
    account.setPin(pin);

    return accountRepository.save(account);

}
Run Code Online (Sandbox Code Playgroud)

现在我的实体类有一个名为 的自动生成字段accountNumber。我的实体类:

@Entity
@Table(name = "accounts")
@Data
public class Account {

    @Column(name = "account_number", length = 32, insertable = false)
    private String accountNumber;

    private Long balance;


}
Run Code Online (Sandbox Code Playgroud)

现在调用后save,返回的实体具有accountNumberasnull但我可以在 intellij 数据库视图中看到它实际上不为空。所有其他自动生成的字段(例如id等)都在返回的实体中,只是为accountNumber空。accountNumber 的默认值在 sql 文件中设置:

ALTER TABLE accounts
  ALTER COLUMN account_number SET DEFAULT DefaultValueSerializer(TRUE, TRUE, 12);
Run Code Online (Sandbox Code Playgroud)

这里,DefaultValueSerializer是生成帐号的函数。

我尝试过这里提供的其他解决方案,例如使用saveAndFlush()等,但在我的情况下没有任何效果。什么可能是一个问题?

pir*_*rho 1

正如评论中提到的,Hibernate 不知道数据库引擎级别发生了什么,因此它看不到生成的值。

将帐号的生成移至 JPA 级别而不是使用数据库默认值是明智的。

我建议你学习注释@GeneratedValue和相关的东西,比如@SequenceGenerator. 这样,生成帐号的控制就在 JPA 级别,并且不需要在保存后刷新实体之类的东西。

一个起点:Java - JPA - 生成器 - @SequenceGenerator

对于非 id 字段,可以在注释为 的方法中生成值,@PrePersist如其他答案所示,但您可以在 s constructor 中进行初始化Account

另请参阅此答案以获取选项。