为实体生成不可预测的随机@Id

时间:2017-12-22 00:57:15

标签: java hibernate spring-data

我有以下代码。由于@Id值是在MariaDB中按顺序生成的,因此不安全:我需要在客户端中公开它。这就是为什么我想要一个不可预测的随机@Id。我该如何更改代码?

@Entity
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id; // Automatic generated value

    // other fields, getters, setters & constructors
}

2 个答案:

答案 0 :(得分:4)

使用Hibernate and UUID identifiers

  

UUID十六进制生成器是最早的UUID标识符生成器和   它以“uuid”类型注册。它可以生成32   具有的十六进制UUID字符串值(它也可以使用分隔符)   以下模式:8 {sep} 8 {sep} 4 {sep} 8 {sep} 4。

@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(columnDefinition = "CHAR(32)")
@Id
private String id;

UUID标识符的一个内容,它适用于作为一个实体类的Hibernate自动密钥生成的MySQL(GenerationType.IDENTITY)和Oracle(GenerationType.SEQUENCE)。

Advantages and disadvantages of GUID / UUID database keys

答案 1 :(得分:3)

如果对默认生成器不满意,您可以按以下方式定义自己的生成器;

@Entity
public class Item implements Serializable {

    @Id
    @GeneratedValue(generator = MyGenerator.generatorName)
    @GenericGenerator(name = MyGenerator.generatorName, strategy = "a.b.c.MyGenerator")
    private String id;

    // rest of the entity
}

发电机本身;

public class MyGenerator implements IdentifierGenerator {

    public static final String generatorName = "myGenerator";

    @Override
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object object) throws HibernateException {
        return UUID.randomUUID().toString().replace("-", "");
        // or any other logic you'd like for generating unique IDs
    }
}