source

시퀀스와 자동 증분에서 모두 작동하도록 @GeneratedValue를 사용하는 방법이 있습니까?

ittop 2023. 8. 30. 22:06
반응형

시퀀스와 자동 증분에서 모두 작동하도록 @GeneratedValue를 사용하는 방법이 있습니까?

저는 MySQL, MariaDB 및 Oracle과 같은 다양한 RDBMS를 사용하여 여러 환경에 배포해야 하는 애플리케이션을 개발하고 있습니다.이는 다양한 ID 생성 모드(자동 증분 대 시퀀스)를 의미합니다.

JPA는 RDBMS로부터의 추상화를 허용해야 하는데, 자동증분과 시퀀스 모두에서 작동할 수 있도록 필드를 어떻게 구성해야 할지 모르겠습니다.

// Auto-increment
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// Sequence
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;

참고로 제가 답을 찾았는데 몇몇 회사들도 같은 어려움을 겪고 있는 것 같습니다.현재 여기에서 답변을 사용할 수 있습니다.

주요 아이디어는 다음과 같습니다.

  1. 를 사용하여 엔티티를 설계합니다.SEQUENCE생성 전략;
  2. Java 기반 주석 매핑을 재정의하는 JPA XML 매핑 파일을 제공합니다.
  3. MySQL(또는 기타 시퀀스 비호환 RDBMS)로 실행할 때 이 매핑 파일을 로드합니다.

이는 다음과 같은 이유로 가능합니다.

XML 메타데이터를 이러한 주석의 대안으로 사용하거나 주석을 재정의하거나 보강할 수 있습니다.

JPA 2.1 규격, 객체/관계 매핑을 위한 11.1 주석

예를 들어, 위에서 링크한 기사의 예를 인용하면 엔티티는 다음과 같습니다.

@Entity(name = "Post")
@Table(name = "post")
public class Post {

    @Id
    @GeneratedValue(
        generator = "sequence",
        strategy = GenerationType.SEQUENCE
    )
    @SequenceGenerator(
        name = "sequence",
        allocationSize = 10
    )
    private Long id;

    private String title;

    //Getters and setters omitted for brevity sake
}

매핑 파일은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
    xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm orm_2_1.xsd"
    version="2.1"
        >
    <package>com.vladmihalcea.book.hpjp.hibernate.identifier.global</package>
    <entity class="Post" access="FIELD">
        <attributes>
            <id name="id">
                <generated-value strategy="IDENTITY"/>
            </id>
        </attributes>
    </entity>
</entity-mappings>

기술적 측면과 사용하지 않는 이유에 대한 자세한 내용은AUTO전략, 기사를 참조하십시오.

언급URL : https://stackoverflow.com/questions/50841647/is-there-a-way-to-use-generatedvalue-so-that-it-works-both-with-sequence-and-au

반응형