当前位置: 首页 > 面试题库 >

JPA或Hibernate生成(非主键)列值,而不是从1开始

满俊楠
2023-03-14
问题内容

我想要一个JPA / Hibernate(最好是JPA)批注,它可以生成列的值,该值不是主键,并且它不能从1开始。

从我看到的内容来看,JPA无法使用@GeneratedValue和@SequenceGenerator和@TableGenerator做到这一点。或其他。

我看到了一个带有额外表的解决方案,但我发现它并不优雅。

我可以使用Hibernate注释,因为我已经有了hibernate注释。

我想使用@Generated,但是我无法使用它,人们声称这是可能的。

@Generated(GenerationTime.INSERT)
private long invoiceNumber;//invoice number

更新:一项额外要求,如果交易回滚,我们在编号上不能有空白。任何人?


问题答案:

这是对我有用的-我们在服务中对所有代码进行了编码。这是实体:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Registrant extends AbstractEntity {
    //....
    private long invoiceNumber;//invoice number

    @Entity
    public static class InvoiceNumberGenerator {
        @Id
        @GeneratedValue
        private int id;
        private long counter;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public long getCounter() {
            return counter;
        }

        public void setCounter(long counter) {
            this.counter = counter;
        }
    }
}

然后,我们有一个执行魔术的服务(实际上没有魔术,所有操作都是手动完成的):

public synchronized Registrant save(Registrant registrant) {
    long counter = getInvoiceNumber();
    registrant.setInvoiceNumber(counter);

    return registrantRepository.save(registrant);
}

private long getInvoiceNumber() {
    //mist: get the invoice number from the other table
    long count = registrantInvoiceNumberGeneratorRepository.count();
    if(count > 1) {
        throw new RuntimeException(": InvoiceNumberGenerator table has more than one row. Fix that");
    }

    Registrant.InvoiceNumberGenerator generator;
    if(count == 0) {
        generator = new Registrant.InvoiceNumberGenerator();
        generator.setCounter(1000001);
        generator = registrantInvoiceNumberGeneratorRepository.save(generator);
    } else {
        generator = registrantInvoiceNumberGeneratorRepository.findFirstByOrderByIdAsc();
    }


    long counter = generator.getCounter();
    generator.setCounter(counter+1);
    registrantInvoiceNumberGeneratorRepository.save(generator);
    return counter;
}

注意synchronized方法-这样没人能得到相同的号码。

我不敢相信没有自动装置可以做到这一点。



 类似资料:
  • 问题内容: 这是我的JPA2 / Hibernate定义: 在MySql中,此列解析为bit(1)数据类型- 不适用于我。对于遗留问题,我需要将布尔值映射到tinyint而不是一点点。但是我看不到更改默认数据类型的可能性。有没有? 问题答案: 试试吧。由于某种原因,它没有声明的简短类型名称,因此您必须使用: 这确实映射为INTEGER类型,但可能与TINYINT一起正常工作。 UPDATE:不会

  • 我有Spring Boot应用程序,我使用JPA层与PostgreSQL交谈。我有一个类型UUID的非主键,我想在调用保存方法时自动生成。我用@GeneratedValue注释了属性,但插入时列值为空。 我还创建了列: 在这种情况下如何自动生成非主要UUID值?

  • 我有一个复合主键,其中一个键为空。实体中必须存在哪些注释,以便我可以使用此类JPA获取数据: 我尝试使用IdClass Annotation和EmbeddedId Annotation,但出现异常: 例如,使用了数据,但在实际项目中使用了类似的数据,因此无法用值替换null。

  • 问题内容: 我的主键实体如下所示 当我跑步时,出现错误 无法获取或更新下一个值;嵌套的异常是org.hibernate.exception.SQLGrammerException:无法获取或更新下一个值 但是当我改变为 没有错误抛出。我想在 oracle db 上为每个表生成唯一的主键。 问题答案: 当将新创建的实体插入数据库时,告诉JPA提供者使用表从中获取ID。 当使用Hibernate作为提

  • 我遇到了一个非常有趣的场景。我知道n+1问题和FetchType.Eager和FetchMode.join。我有一个家长实体学校,它有2@onetomany儿童实体ie学生和教师。我需要所有3个,所以使用fetchtype.eager和fetchmode.join。 学校实体 学生实体 教师实体 学校回购 如果我通过findById方法获取School对象,即表的主键。 生成的SQL是学校、学生和

  • 问题内容: JPA规范是否允许对非主键列的简单引用? 我想在引用中使用在Countrys表上有一个简单的替代/自然键(UNIQUE,NOT NULL)列iso_code,但是Eclipse的Dali显示了验证错误,并且Hibernate抛出了MappingException。 是否允许这种常见情况? 问题答案: @axtavt:看来您的答案不正确。我刚刚收到了来自“ Pro JPA 2.0”作者的