我有以下实体:
@Entity
public class User {
@Id
@GeneratedValue
private Integer id;
private String name;
private String uberField;
}
我的目的是让uberField包含一个随机数字(0-9)并将其连接到char' - '和实体ID。例如:
ID为233的用户将收到uberField ==" 6-223"
问题是每当我创建一个新实体时我都要保存两次,因为这不会起作用:
User newUser = new User();
newUser.setUberField(genUber(user)); // not working!!! no id yet
save(newUser); // not working!!! no id yet
这将有效:
User newUser = new User();
save(newUser); // Save 1st
newUser.setUberField(genUber(user));
save(newUser); // save 2nd time
我可以克服这种多余的保存吗?
答案 0 :(得分:0)
为什么需要在两个字段中保存实体ID?而不是在从表中选择数据时计算该字段吗?
一种替代解决方案是手动控制序列生成,并实现自己的序列号缓存。这将允许您删除第二个更新。即如果您使用的是Oracle:
class SequenceNumberCache {
void init() {
increment = jdbcTemplate.queryForInt("select increment_by from user_sequences where name = ...");
}
int getNextSequence() {
if(availableValues > 0) {
availableValues--;
return nextValue++;
}
availableValues = increment - 1;
nextValue = jdbcTemplate.queryForInt("select seq.nextval from dual");
return nextValue++;
}
}