如何覆盖@SequenceGenerator(name = "idGenerator",sequenceName = "HIBERNATE_SEQUENCE",allocationSize = 50)

jay*_*iya 4 hibernate jpa

通常 Id 列如下所示,它工作得很好并且生成了序列值

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator")
@SequenceGenerator(name = "idGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50)
@Column(name = "ID")
public Long getId()
{ return mId; }
Run Code Online (Sandbox Code Playgroud)

现在我想要的是,如果在程序中设置 xyz.setId(200) ,它应该将 Id 保存为 200,而不是由序列生成的 Id。现在我该如何实现这一目标?我还想使用这两个属性sequenceName =“HIBERNATE_SEQUENCE”,allocationSize = 50。

jay*_*iya 5

最后,经过一天的使用时间,我深入到罐子里,得到了解决方案。我用了 @GenericGenerator(name = "idGenerator", strategy = "com.jayash.domain.UseExistingOrGenerateIdGenerator")

public class UseExistingOrGenerateIdGenerator extends SequenceHiLoGenerator {
    @Override
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
        Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);
        return id != null ? id : super.generate(session, object);
    }

    @Override
    public void configure(Type type, Properties params, Dialect dialect) throws MappingException {

        params.put(org.hibernate.id.SequenceGenerator.SEQUENCE, "HIBERNATE_SEQUENCE");


        params.put(SequenceHiLoGenerator.MAX_LO, String.valueOf("49"));

        super.configure(type, params, dialect);
    }

}
Run Code Online (Sandbox Code Playgroud)

Yipee 效果很好