相关疑难解决方法(0)

Hibernate,@ SequenceGenerator和allocationSize

我们都知道Hibernate在使用时的默认行为@SequenceGenerator- 它将实际数据库序列增加1,将此值乘以50(默认allocationSize值) - 然后将此值用作实体ID.

这是不正确的行为,并与规范冲突说:

allocationSize - (可选)从序列中分配序列号时的增量.

要明确:我不打算生成ID之间的差距.

我关心的是与底层数据库序列不一致的 ID .例如:任何其他应用程序(例如使用普通JDBC)可能希望在从序列获取的ID下插入新行 - 但所有这些值可能已被Hibernate使用!疯狂.

有人知道这个问题的任何解决方案(没有设置allocationSize=1,从而降低性能)?

编辑:说
清楚.如果最后插入的记录具有ID = 1,则HB同时使用51, 52, 53...其新实体BUT的值:数据库中的序列值将设置为2.当其他应用程序使用该序列时,这很容易导致错误.

另一方面:规范说(根据我的理解)数据库序列应该被设置为51,同时HB应该使用范围中的值 2, 3 ... 50


更新:
正如Steve Ebersole在下面提到的:我可以通过设置启用我描述的行为(也是最直观的行为)hibernate.id.new_generator_mappings=true.

谢谢大家.

更新2:
对于未来的读者,您可以在下面找到一个有效的例子.

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
    @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
    private Long id;
}
Run Code Online (Sandbox Code Playgroud)

persistence.xml中

<persistence-unit name="testPU"> …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa hilo

109
推荐指数
2
解决办法
11万
查看次数

Java - JPA - 生成器 - @SequenceGenerator

我正在学习JPA并且在@SequenceGenerator注释中有困惑.

据我了解,它会自动为实体的数字标识字段/属性赋值.

Q1.此序列生成器是否利用数据库增加的数值生成功能或自己生成数字?

Q2.如果JPA使用数据库自​​动增量功能,那么它是否适用于没有自动增量功能的数据存储?

Q3.如果JPA自己生成数值,那么JPA实现如何知道接下来要生成哪个值?是否先咨询数据库以查看最后存储的值以生成值(last + 1)?


Q4.还请详细说明注释sequenceNameallocationSize属性@SequenceGenerator.

java jpa

45
推荐指数
5
解决办法
10万
查看次数

生成的序列以1而不是1000开始,在注释中设置

我想问一些关于Hibernate创建的数据库序列的帮助.

我在我的实体类中有这个注释 - 下面的代码,以便为partner表提供单独的序列.我希望序列以1000开头,因为我在部署期间使用import.sql将测试数据插入到我的数据库中,我想避免违反约束.但是当我想要保留数据而不是我得到约束违规异常时,它告诉我partner_id = 2已经存在的事实.看起来我错过了什么.

    @Id
    @Column(name = "partner_id")
    @SequenceGenerator(initialValue=1000, 
                        allocationSize=1,
                        name = "partner_sequence", 
                        sequenceName="partner_sequence")
    @GeneratedValue(generator="partner_sequence")
    private Long partnerId;
Run Code Online (Sandbox Code Playgroud)

生成的序列如下所示:

CREATE SEQUENCE partner_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE partner_sequence
  OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

我使用postgres 9.1.

我错过了什么?这是我如何处理我想要的方式?

在此先感谢您的帮助!

java hibernate jpa java-ee

6
推荐指数
2
解决办法
9296
查看次数

Hibernate 序列生成器不一致

我有一个表,其促销 ID 注释为

@SequenceGenerator(name="GEN_PROMID", sequenceName="SEQ_PROMOTIONID", allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GEN_PROMID")
@Column(name="PROMOTIONID")
private Long promotionid;
Run Code Online (Sandbox Code Playgroud)

但即使allocationSize 被指定为1,hibernate 也会不一致地增加数字。以下是数据库中 Promotionid 的最新降序值

1440
1420
1407
1406
1405
1404
1403
1402
1401
1400
1380
1360
1342
1341
1340
1320
1305
Run Code Online (Sandbox Code Playgroud)

我在某处读到 Hibernate 可能会使用 hilo seq_hilo algotihm 和org.hibernate.id.SequenceHiLoGenerator生成器,即使@SequenceGenerator已定义。另请阅读以下链接,我们可以使用它@GenericGenerator来解决链接中的此问题

有人可以在这方面提供详细信息吗?语法@GenericGenerator看起来并不简单。该@SequenceGenerator用还是不用。有时@SequenceGenerator可以完美地工作并生成正确的主键。

附言。我正在使用 Hibernate 3.5 并使用 Oracle 11g DB

编辑

序列码-

CREATE SEQUENCE SEQ_PROMOTIONID
    INCREMENT BY 1
    START WITH 100;
Run Code Online (Sandbox Code Playgroud)

编辑2

更多分析表明,至少“总是”插入一个可被 20 整除的值。由于Oracle的序列默认缓存为20,因此看起来hibernate的正常增量与缓存值之间存在一些冲突。还观察到,当插入之间有时间间隙时,它通常会转到下一个可被 20 …

oracle hibernate hilo sequence-generators jpa-annotations

5
推荐指数
1
解决办法
2832
查看次数

Hibernate抛出PK违规错误

我一直在使用jboss 4.2.3的hibernate,一切正常,现在我将代码迁移到Jboss 7.1.1,突然我开始得到:

Caused by: org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (OBLICORE.PK_ACE_WORKERS_QUEUE_STATS_ID) violated
Run Code Online (Sandbox Code Playgroud)

生成的ID也是负数.

失败的实体定义如下:

@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;
Run Code Online (Sandbox Code Playgroud)

我检查了Oracle中的序列,看起来没问题(就像我说的那样,它之前使用的是jboss 4.2,并且自迁移以来在数据库方面没有任何变化).

我尝试编写Hibernate查询日志,但找不到该查询,我还记录了持久化该类的特定调用,并发现它只被调用一次.

java oracle hibernate jpa jboss7.x

4
推荐指数
1
解决办法
6726
查看次数

Hibernate 5序列生成问题

我从3迁移到hibernate 5.我看到序列生成器在Hibernate 5中无法正常工作.我的序列定义为最小值1000并且递增1.但是当我尝试创建新的实体记录时,我看到了用id 951插入的记录.似乎id是实际序列下一个值的50.在我的情况下,ID应为1000.

请让我知道任何帮助.

这是我的实体和顺序:

实体:

@Entity
@Table(name = "SOME TABLE")
public class Group {

  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "name",  sequenceName ="SEQ_name" )
  @GeneratedValue(strategy = GenerationType.AUTO, generator="name")
  private Long id;

  @Pattern(regexp = "^[^\\*]*$", message = "{3011}")
  @Size(message = "{3014}")
  @NotBlank(message = "{3000}")
  @Column(name = NAME, unique = true, nullable = false)
  private String name;
Run Code Online (Sandbox Code Playgroud)

序列:

CREATE SEQUENCE  SEQ_name MINVALUE 1000 NOMAXVALUE INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE;
Run Code Online (Sandbox Code Playgroud)

oracle jpa hibernate-5.x

4
推荐指数
2
解决办法
3176
查看次数

JPA/Hibernate对Oracle序列的增量太多

我在我的Java项目上使用Hibernate,我有Oracle DB.一个ID列,我确定了一个增量为1的序列.但这就是JPA/Hibernate从序列中获取nextVal的方式:

1   1451
2   1450
3   1402
4   1401
5   1400
6   1352
7   1351
8   1350
9    426
Run Code Online (Sandbox Code Playgroud)

您可以看到nextVal有时会得到1,但大多数是50或更多.我甚至看到序列200的开始,即使我把起始值1.为什么会发生这种情况?这是正常的吗?

我可以以某种方式减少这个"50"增量吗?

编辑:重复的hibernate oracle序列产生很大的差距

java oracle hibernate jpa sequence

3
推荐指数
1
解决办法
7688
查看次数

JPA Eclipselink获取错误的序列号

我正在使用映射到Oracle DB-Tables的一些实体.对于ID-Generation,我使用的注释序列生成器如下:

@Id
@SequenceGenerator(name = "SEQ_RULES", sequenceName = "SEQUENZ_RULES")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RULES")
@Column(name = "SERIALNO")
protected Long serialno;
Run Code Online (Sandbox Code Playgroud)

在程序执行期间,我从我的实体创建一个新实例,并希望保留这个生成的实例.重新启动数据库后,我通过JPA-EclipseLink获得了错误的序列号,但没有直接通过数据库上的控制台.

我在persistence.xml中启用了以下属性,以获取生成的语句中使用的绑定参数.

<properties>
  <property name="eclipselink.logging.level" value="FINE"/>
  <property name="eclipselink.logging.parameters" value="true"/>
</properties>
Run Code Online (Sandbox Code Playgroud)

例如:如果我生成一个我的实体的新实例并希望保留这个实例,那么我将获得2717 for serialNo并且如果我执行

SELECT SEQUENZ_RULES.NEXTVAL FROM DUAL 
Run Code Online (Sandbox Code Playgroud)

我得到2767作为nextval.问题是JPA生成的serialNo必须是唯一的,现在我仍然有一些带有这个serialNo的数据集.我得到一个例外:

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (JASON.SYS_C0084866) violated
Run Code Online (Sandbox Code Playgroud)

非是否有任何缓存通过eclipse影响序列生成或可能是什么错误?

使用的组件:
GlassFish 3.1.1
EclipseLink 2.3.0.v20110604-r9504
数据库:Oracle版本:Oracle Database 11g 11.1.0.7.0版 - 64位
驱动程序:Oracle JDBC驱动程序版本:11.2.0.1.0

提前致谢

阿德姆

java jpa sequence eclipselink

3
推荐指数
1
解决办法
6838
查看次数

Hibernate 和 Oracle 序列

我对 Oracle 序列和 Hibernate 有疑问。我使用这段代码通过 hibernate 获取 Oracle 序列

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq")
@SequenceGenerator(name = "student_id_seq", sequenceName = "Student_seq")
@Column(name = "StudentID")
public Long getStudentId() {
    return this.studentId;
}

public void setStudentId(Long studentId) {
    this.studentId = studentId;
}
Run Code Online (Sandbox Code Playgroud)

但是当我向表中插入新值时,生成的值不正确。例如:当我在数据库中有两条记录,id分别为2和3,当我插入新记录时,它的id不是4而是25。我不知道如何处理它。

java oracle hibernate

1
推荐指数
1
解决办法
2万
查看次数