기본 키에 Oracle의 Sys_guid ()를 사용하도록 최대 절전 모드 구성
문제
나는 최대 절전 모드가 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가 무엇인지 알아야하기 때문입니다. 예를 들어 다음 시나리오를 고려하십시오.
- 새로운 제품 객체를 만들어 저장합니다. Oracle은 ID를 할당합니다.
- 최대 절전 모드 세션에서 제품을 분리합니다.
- 당신은 나중에 그것을 다시 붙잡고 약간의 변경을합니다.
- 이제 이러한 변경 사항을 지속하려고합니다.
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>