我有一个新对象。我想知道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;