有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用Hibernate在Java中实现序列

我使用Java和Hibernate作为ORM工具。是否有任何方法可以使用Hibernate在Java中实现序列

目前我正在使用Oracle序列来实现这一点,但随着与数据库交互的增加,这是一种非常昂贵的方法


共 (3) 个答案

  1. # 1 楼答案

    这其实是一件很容易做到的事情:

    package mypackage;
    import org.hibernate.id.IdentifierGenerator;
    import org.hibernate.engine.SessionImplementor;
    import org.hibernate.HibernateException;
    
    import java.io.Serializable;
    import java.security.SecureRandom;
    import java.util.UUID;
    
    public class RandomIdentifierGenerator implements IdentifierGenerator {
    
      private final static SecureRandom sr = new SecureRandom();
    
      public Serializable generate(SessionImplementor sessionImplementor, Object o) throws HibernateException {
        long val = sr.nextLong();
        return Long.toString(Math.abs(val), Character.MAX_RADIX);
      }
    }
    

    IdentitfierGenerator是必须实现的hibernate接口。上面的例子只是生成一个随机id

    为了使用它,必须将generator设置为mypackage.RandomIdentifierGenerator

    显然,这个实现无法保证不会两次生成相同的id,这对于您正在编写的应用程序可能很重要,也可能不重要

  2. # 2 楼答案

    Currently I am using Oracle sequences to achieve this, but that is a very costly way as interaction with database increases.

    您确定使用Oracle序列成本高昂吗?正如其他评论者所提到的,这不太可能。话虽如此,您应该尝试使用增量大于1的序列。将这些序列与hi-lopooled{a1}一起使用可能会很好地工作。这确保了如果N是序列的增量大小,则Hibernate Session只会在N插入中命中数据库一次。缺点是必须使用单独的create_time列来标识行的插入顺序

  3. # 3 楼答案

    我用它来生成主键:java。util。乌伊德。randomUUID()。toString()。替换全部(“-”,“)

    它将生成如下32位主键:1b694a70285f49c8a25a5de598042e7b

    使用这种方法几乎不可能获得重复的主键

    将它与hibernate GeneratedValue一起使用会很好。 示例代码如下:

    @GeneratedValue(generator="UUIdentifier")
    @GenericGenerator(name="UUIdentifier", strategy = "uuid")
    private String resourceId;
    

    uuid set by to strategy是由Hibernate提供的,您可以使用自己的类的限定名来逐个使用自己的Java类策略