기존 Oracle 시퀀스를 사용하여 최대 절전 모드에서 ID를 생성하는 방법은 무엇입니까?
이름이 지정된 시퀀스가 있는 레거시 Oracle db가 있습니다.PRODUCT_ID_SEQ.
다음은 의 매핑입니다.Product올바른 ID를 생성해야 하는 클래스:
public class Product {
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "retailerRaw_seq")
@SequenceGenerator(name = "retailerRaw_seq",
sequenceName = "PRODUCT_ID_SEQ")
private Long id;
...
}
그러나 1000, 1050, 1100 등 50개의 간격으로 ID가 생성되는 것 같습니다.이 값은 의 기본값에 해당합니다.allocationSize속성 = 50.즉, Hibernate는 DB에 이미 정의된 시퀀스를 실제로 사용하지 않습니다.
Hibernate가 시퀀스를 사용하도록 하려면 어떻게 해야 합니까?
원래 질문에 대한 답은 다음과 같습니다.
@SequenceGenerator(name="EL_SEQ", sequenceName="EL_SEQ",allocationSize=1)
그렇다.allocationSize증분할 값을 설정합니다.
주석을 사용하는 데 익숙하지 않습니다. *.hbm.xml에 있는 내용은 다음과 같습니다.
<id name="id" type="java.lang.Integer">
<column name="ID_PRODUCT" />
<generator class="sequence-identity" >
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
</id>
이것을 주석에 쉽게 매핑할 수 있습니다.생성기 시퀀스 ID는 시퀀스와 함께 자동 증분을 사용합니다.
다음은 주석을 사용한 작업 예제입니다. 이러한 방식으로 기존 DB 시퀀스가 사용됩니다("시퀀스" 전략을 사용할 수도 있지만 삽입 시 성능이 떨어짐).
@Entity
@Table(name = "USER")
public class User {
// (...)
@GenericGenerator(name = "generator", strategy = "sequence-identity", parameters = @Parameter(name = "sequence", value = "USER_SEQ"))
@Id
@GeneratedValue(generator = "generator")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public Long getId() {
return this.id;
}
3.5.5에서 5.0.6으로 업그레이드할 때도 같은 문제가 있었습니다.최종.
HBM 파일의 매핑을 다음과 같이 재구성하여 해결했습니다.
<generator class="sequence">
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
대상:
<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
<param name="prefer_sequence_per_entity">true</param>
<param name="optimizer">none</param>
<param name="increment_size">1</param>
<param name="sequence_name">PRODUCT_ID_SEQ</param>
</generator>
시퀀스 이름을 Oracle에서 생성합니다(예: contacts_seq).당신의 POJO 수업에서.시퀀스에 대해 다음 주석을 정의합니다.
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen")
@SequenceGenerator(name="my_seq_gen", sequenceName="contacts_seq")
javax.persistence를 사용하는 경우.시퀀스 생성기, 최대 절전 모드는 hilo를 사용하며 시퀀스에 큰 간격을 만들 수 있습니다.이 문제를 해결하는 게시물이 있습니다. https://forum.hibernate.org/viewtopic.php?t=973682
이 문제를 해결하는 두 가지 방법이 있습니다.
시퀀스 생성기 주석에서 allocationSize = 1, initialValue = 1을 추가합니다.
javax.decence를 사용하는 대신.SequenceGenerator는 다음과 같이 org.hibernate.notation을 사용합니다.
@상당히 독립함시퀀스 생성기(이름 = "Question_id_sequence", 시퀀스 이름 = "S_QUESTION")
@무조건.무조건.일반 생성기(이름=")Question_id_sequence", strategy = "sequence", 매개 변수 = {@Parameter(name="sequence"), value="S_QUESTION") })
저는 두 가지 방법을 모두 테스트했는데, 잘 작동합니다.
allocationSize와 incrementBy는 완전히 다릅니다.
최대 절전 모드는 물론 DB에서 만든 시퀀스를 사용하지만 할당 크기에 따라 생성된 값에 차이가 있을 수 있습니다.
예를 들어 - 현재 시퀀스 값이 5이고 db에서 1씩 증가하며 allocationSize 기본값이 50이라고 가정합니다.
이제 최대 절전 모드를 통해 3개 요소 모음을 저장하려면 최대 절전 모드에서 생성된 ID 250, 251, 252를 할당합니다.
이는 최적화를 위한 것입니다.최대 절전 모드는 DB로 돌아가서 다음 증분 값을 가져올 필요가 없습니다.
만약 당신이 이것을 원하지 않는다면 단지 설정.allocationSize = 1입니다.
Postgre에서 다음을 사용합니다.SQL과 잘 작동합니다.
@Id
@GeneratedValue(generator = "my_gen")
@SequenceGenerator(name = "my_gen", sequenceName = "my_seq_in_db")
private int userId;
기본적으로 최대 절전 모드에서는 특별한 요구가 없는 한 성능이 양호한 시퀀스 HiLo 제너레이터를 사용합니다.여기 제 블로그에서 더 많은 것을 읽을 수 있습니다.
에얄
첫 번째: 데이터베이스에 다음과 같은 순서를 만들어야 합니다.
CREATE SEQUENCE "PRODUCT_ID_SEQ" MINVALUE 0 MAXVALUE 1000000000 INCREMENT BY 1 START WITH 1 CACHE 500 NOORDER NOCYCLE ;
파일 Product.hbm.xml 구성에서 다음을 수행합니다.
<class name="ProductPersistant" table="Product">
<id name="id" type="java.lang.Long" column="productID" >
<generator class="sequence">
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
</id>
언급URL : https://stackoverflow.com/questions/2155376/how-to-use-existing-oracle-sequence-to-generate-id-in-hibernate
'programing' 카테고리의 다른 글
| 한 열의 최소값이 있고 다른 열의 값이 지정된 경우 레코드를 선택하려면 어떻게 해야 합니까? (0) | 2023.06.18 |
|---|---|
| 소방서:컬렉션에서 임의의 문서를 가져오는 방법 (0) | 2023.06.18 |
| grid.arrange를 사용하여 가변 플롯 목록을 정렬하려면 어떻게 해야 합니까? (0) | 2023.06.13 |
| POI / Excel : "상대적" 방식으로 공식 적용 (0) | 2023.06.13 |
| 'finally'는 항상 파이썬에서 실행됩니까? (0) | 2023.06.13 |