使用自定义ID生成器的Hibernate JPA?

4
我有一个生成自定义id的Generator类,使用jpa注释在hibernate中实现,我的Generator类如下所示:
public class PolIdGenerator implements  IdentifierGenerator {

    public int generatePolId() {
        Random random = new Random();
        return random.nextInt(100);
    }

    @Override
    public Serializable generate(SessionImplementor si, Object o) throws HibernateException {
        return "POL" + this.generatePolId();
    }    
}

我想在我的实体中使用它,我将其编写如下:
@Entity
@Table(name="POLI")
public class Poli extends DefaultEntityImpl implements Serializable{

    @GeneratedValue(generator = "polIdGenerator")
    @GenericGenerator(name = "polIdGenerator", 
        parameters = @Parameter(name = "prefix", value = "pol"),
        strategy = "id.rekam.medis.generator.PolIdGenerator")
    @Id    
    @Column(name = "ID")
    private String id;

}

对我没有用,这是我的参考https://www.onlinetutorialspoint.com/hibernate/custom-generator-class-in-hibernate.html#comment-58952


请精确地定义“不工作”。您正在做什么,您期望发生什么,实际上会发生什么? - JB Nizet
1
你的包名是否正确?id.rekam.medis.generator。请检查一下。 - GolamMazid Sajib
1
请在问题中添加您的生成器类和实体类以及导入。同时添加您的错误信息。 - GolamMazid Sajib
哦,对不起,我忘记在实体中更改我的生成器包。现在已经解决并且可以工作了。非常感谢你,兄弟@sajib。 - Tarmizi Hamid
2
你不应该在0到100之间随机选择一个值作为你的ID - 这将很快导致重复的ID。 - T A
1个回答

3

例如,您可以通过扩展org.hibernate.id.UUIDGenerator来改进ID生成器,如下所示:

package com.project.generator;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.UUIDGenerator;

import java.io.Serializable;
import java.util.Objects;
import java.util.Random;

/**
 * A custom Id generator based on combination of long time hex string and UUID
 *
 * @author Ehab Qadah
 */
public class CustomIdentifierGenerator extends UUIDGenerator {

    private static final int NUMBER_OF_CHARS_IN_ID_PART = -4;

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object obj) throws HibernateException {
        final String uuid = super.generate(session, obj).toString();
        final long longTimeRandom = System.nanoTime() + System.currentTimeMillis() + new Random().nextLong() + Objects.hash(obj);
        final String timeHex = Long.toHexString(longTimeRandom);
        return "POL"+ StringUtils.substring(timeHex, NUMBER_OF_CHARS_IN_ID_PART) + StringUtils.substring(uuid, NUMBER_OF_CHARS_IN_ID_PART);
    }
}

然后像这样使用:

    @Id
    @GeneratedValue(generator = "custom-generator", strategy = GenerationType.IDENTITY)
    @GenericGenerator(name = "custom-generator", strategy = "com.project.CustomIdentifierGenerator")
    protected String id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接