我有一个新对象。我想知道ID,然后再保存。是否可以?还是有另一种方法呢?我正在使用jpa作为orm和oracle作为数据库。

@Id
@Basic(optional = false)
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "woTypeSeq")
private Long id;

我的实体中有一个代码字段。如果用户未为code字段输入值,则我想将代码设置为实体的ID。如果我坚持实体,我当然可以获取ID并将代码值设置为ID,但这是额外的查询数据库。

我想做这样的事情
if(entity.getCode()==null) {
   entity.setCode(entity.getId);
   jpaDao.saveOrUpdate(entity);
}

最佳答案

经过长时间的研究,终于找到了解决方案。

实际上,如果在jpa中使用序列生成器,则肯定无法在将实体ID保存到数据库之前获取实体的ID,因为下一个ID将由数据库序列分配。

如果使用自定义生成器,则有一种获取ID的方法,可以在保存之前获取ID。这是简单的实现:

public class CustomGenerator extends IdentityGenerator implements Configurable {

    private IdentifierGenerator defaultGenerator;

    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
        Long idValue = (Long)defaultGenerator.generate(session, object);
        //idValue will be assigned your entity id
        return idValue;
    }

    @Override
    public void configure(Type type, Properties params, Dialect d) throws MappingException {
        DefaultIdentifierGeneratorFactory dd = new DefaultIdentifierGeneratorFactory();
        dd.setDialect(d);
        defaultGenerator = dd.createIdentifierGenerator("sequence", type, params);
    }
}

使用CustomGenerator for id字段:
@Id
@Basic(optional = false)
@Column(name = "ID", nullable = false)
@GenericGenerator(name = "seq_id", strategy = "com.yoncabt.abys.core.listener.CustomGenerator", parameters = { @Parameter(name = "sequence", value = "II_FIRM_DOC_PRM_SEQ") })
@GeneratedValue(generator = "seq_id")
private Long id;

10-01 00:49
查看更多