Hibernate \ JPA实体保存冗余

时间:2013-09-08 10:41:58

标签: hibernate jpa entity

我有以下实体:

 @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

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

1 个答案:

答案 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++;
    }
}