我想要一个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”作者的