0

我有以下实体:

 @Entity 
 public class User {

 @Id
 @GeneratedValue
 private Integer id;
 private String name;
 private String uberField;
 }

我的目的是让 uberField 包含一个随机数字(0-9)并将其连接到字符“-”和实体 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

我可以克服这个多余的保存吗?

4

1 回答 1

0

为什么需要将实体ID保存在两个字段中?您不能在从表中选择数据时计算该字段吗?

一种替代解决方案是手动控制序列生成,并实现您自己的序列号缓存。这将允许您删除第二个 UPDATE。即,如果您使用的是 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++;
    }
}
于 2013-09-08T11:12:22.767 回答