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()等,但在我的情况下没有任何效果。什么可能是一个问题?
正如评论中提到的,Hibernate 不知道数据库引擎级别发生了什么,因此它看不到生成的值。
将帐号的生成移至 JPA 级别而不是使用数据库默认值是明智的。
我建议你学习注释@GeneratedValue和相关的东西,比如@SequenceGenerator. 这样,生成帐号的控制就在 JPA 级别,并且不需要在保存后刷新实体之类的东西。
一个起点:Java - JPA - 生成器 - @SequenceGenerator
对于非 id 字段,可以在注释为 的方法中生成值,@PrePersist如其他答案所示,但您可以在 s constructor 中进行初始化Account。
另请参阅此答案以获取选项。
| 归档时间: |
|
| 查看次数: |
5339 次 |
| 最近记录: |