문제

나는 최대 절전 모드가 Oracle 's를 사용할 수있는 방법을 찾고 있습니다. SYS_GUID() 새 행을 삽입 할 때 기능합니다. 현재 내 DB 테이블이 있습니다 SYS_GUID() 기본값으로 최대 절전 모드가 단순히 SQL을 생성 한 경우 값을 생략 한 SQL을 생성했습니다.

모든 것이 작동하지만 현재 System-UUID 생성기를 사용하여 코드로 UUID/GIDE를 생성하고 있습니다.

@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "PRODUCT_ID", unique = true, nullable = false)
public String getId() {
    return this.productId;
}

이것은 괜찮지 만 데이터베이스에 의해 안내서가 생성되어 순차적이며 잠재적으로 더 나은 성능을 갖는 것을 선호합니다. 또한이를 구성하는 방법을 알고 싶습니다.

구성에 주석을 사용하고 있지만 XML 구성 예제도 훌륭합니다.

다음은 샘플 테이블 정의입니다 (중요한 경우) :

CREATE TABLE SCHEMA_NAME.PRODUCT
(
    PRODUCT_ID RAW(16) DEFAULT SYS_GUID() NOT NULL,
    PRODUCT_CODE VARCHAR2(10 CHAR) NOT NULL,
    PRODUCT_NAME VARCHAR2(30 CHAR) NOT NULL,
    PRODUCT_DESC VARCHAR2(512 CHAR)
)

업데이트:

Mat의 "Guid"사용에 대한 Sollution은 다음과 같습니다. SQL은 다음과 같습니다.

Hibernate: 
    select rawtohex(sys_guid()) 
    from dual
Hibernate: 
    insert into PRODUCT
    (PRODUCT_CODE, PRODUCT_DESC, LOB_ID, PRODUCT_NAME, PROVIDER_ID, PRODUCT_ID) 
    values (?, ?, ?, ?, ?, ?)

삽입물에서 열 기본값을 사용하는 것은 불가능한 것으로 보이므로 선택은 응용 프로그램 생성 GUID와 데이터베이스 왕복간에 선택 사항입니다.

도움이 되었습니까?

해결책

"Guid"생성기를 사용할 수 있습니다. 보다 이 게시물 최대 절전 모드 포럼에서. 그들이 Oracle 사용에 대한 지원을 추가 한 것 같습니다 SYS_GUID() 얼마 전, 그러나 선적 서류 비치 여전히 SQL Server와 MySQL 만 지원한다고 말합니다.

아직 JPA 주석을 사용하지 않았지만 XML 구성을 사용하는 예는 다음과 같습니다.

<id name="PRODUCT_ID">
  <generator class="guid" />
</id>

편집하다: 두 번째 질문과 관련하여, 나는 당신이 왜 최대 절전 모드가 왜 이런 일을 할 수 없는지 묻고 있다고 생각합니다.

INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */

그 이유는 최대 절전 모드가 객체의 ID가 무엇인지 알아야하기 때문입니다. 예를 들어 다음 시나리오를 고려하십시오.

  1. 새로운 제품 객체를 만들어 저장합니다. Oracle은 ID를 할당합니다.
  2. 최대 절전 모드 세션에서 제품을 분리합니다.
  3. 당신은 나중에 그것을 다시 붙잡고 약간의 변경을합니다.
  4. 이제 이러한 변경 사항을 지속하려고합니다.

ID를 알지 못하면 최대 절전 모드는 이것을 할 수 없습니다. 업데이트 문을 발행하려면 ID가 필요합니다. 그래서 구현 org.hibernate.id.GUIDGenerator 사전에 ID를 생성 한 다음 나중에 삽입 문에서 재사용해야합니다.

이것이 최대 절전 모드가 할 수없는 것과 같은 이유입니다 모든 배치 데이터베이스 생성 ID를 사용하는 경우 (지원하는 데이터베이스의 자동 증가 포함). Hilo 생성기 중 하나 또는 다른 동면 생성 ID 메커니즘을 사용하는 것이 한 번에 많은 객체를 삽입 할 때 좋은 성능을 얻는 유일한 방법입니다.

다른 팁

주제 스타터와 같은 작업이 있습니다. 감사합니다 @Matt Solnit 제안 나는 그러한 주석을 사용합니다.

@Id
@NotNull
@Column(name = "UUID")
@GenericGenerator(name = "db-uuid", strategy = "guid")
@GeneratedValue(generator = "db-uuid")
private String uuid;
public String getUuid() { return uuid; }
public void setUuid(String uuid) { this.uuid = uuid; }

strategy = "guid" 그리고 String 유형은 솔루션의 필수 부분입니다.

새로운 엔티티를 지속하기 전에 최대 절전 모드 문제 SQL 쿼리 :

select rawtohex(sys_guid()) from dual

내 설정 : Oracle 11, Hibernate 4.3.4.final, Spring 3.2.x. 그리고 필드입니다 raw(16) 효율적인 스토리지 및 적은 인덱스 크기를위한 테이블에서 사용하는 경우 char(32).

내가 사용하려고 할 때 java.util.UUID ID 필드 유형 I로서 새로운 엔티티 지속에 대한 최대 절전 모드에서 오류가 발생합니다 (설정하려고합니다. String 타입 java.util.UUID 필드).

또한 나는 사용한다 javax.xml.bind.DatatypeConverter 비 정밀 쿼리 (Spring JDBC 헬퍼)의 경우, Convert로 전달합니다. byte[]:

String query = "insert into TBL (UUID, COMPANY) values (:UUID, :COMPANY)";
MapSqlParameterSource parameters = new MapSqlParameterSource()
    .addValue("COMPANY", repo.getCompany())
    .addValue("UUID", DatatypeConverter.parseHexBinary(signal.getUuid()));
namedJdbcTemplate.update(query, parameters);

추출 용 :

ResultSet rs;
sig.id = DatatypeConverter.printHexBinary(rs.getBytes("UUID"));

모든 웹 컨트롤러는 다음과 같은 코드를 얻습니다.

025131763FB19522E050010A106D11E9

없이 {, -, } 숯 (UUID의 일반적인 표현 {a-b-c-d-x-y} 기억한다면). 이 표현은 이미 깨끗하고 안전한 URL을 인코딩하고 있습니다. 구현할 필요가 없습니다 PropertyEditor 또는 Convertor ~을 위한 String 유형:

@RequestMapping(value = {"/signal/edit/{id}.htm"}, method = RequestMethod.POST)
public String handleEditRequest(
        @PathVariable("id") String id,

실패한 사용 시도와 비교하십시오 jaa.util.UUID, 내가 쓸 필요가있는 곳 :

@Component
public static class UUIDPropertyEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(final String str) {
        if (str == null || str.isEmpty()) {
            setValue(null);
            return;
        }
        setValue(UUID.fromString(str));
    }
}
private @Autowired UUIDPropertyEditor juuidPE;

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(UUIDPropertyEditor.class, juuidPE);
}

사용하기 위해 :

@PathVariable("id") UUID id,

발전기를 기본으로 설정하여 할 수 있다고 생각합니다. 나는 최대 절전 모드에서 어떻게 해야할지 잘 모르겠지만 nhibernate에서는 XML에서 이와 같은 일을 할 것입니다.

<id column="PRODUCT_ID">
  <generator class="native"/>
</id>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top