문제

기본적으로 데이터베이스 중립적 인 방식으로 시퀀스 값에 액세스하는 방법을 원합니다. 유스 케이스는 증분 값 (ID 이외의)을 기준으로 설정하려는 엔티티의 필드가 있다는 것입니다.

예를 들어, 내가 가지고 있다고 말합니다 Shipment 실재. 배송이 생성 된 후 어느 시점에서 배송됩니다. 배송되면 매니페스트 번호가 생성되어 할당됩니다. 매니페스트 번호는 같은 것으로 보입니다 M000009 (여기서 'm'이후의 물건은 시퀀스에서 왼쪽으로 된 값입니다).

비슷한 질문이 생겼습니다 여기서 그러나 나는 다른 테이블을 유지하기 위해 다른 테이블이 필요하고 이상한 관계처럼 보이기 때문에 솔루션의 팬이 아닙니다.

최대 절전 모드와 같은 것을 사용할 수 있는지 아는 사람이 있습니까? MultipleHiLoPerTableGenerator ID 생성기가 아닌 다른 것입니까?

그것이 가능하지 않은 경우, 누구든지 이것을 처리하는 라이브러리를 알고 있습니까 (최대 절전 모드 사용 또는 순수한 JDBC). 나는 이것을 직접 작성하지 않아도되기를 원하며 (프리 페치 값, 잠금 및 동기화를 다루어야한다).

감사.

도움이 되었습니까?

해결책

나는 당신의 작업의 복잡성이 당신이 나타나는 숫자를 순차적으로 나타내야하는지 여부에 달려 있다고 생각합니다.

  • 순차적 인 매니페스트 숫자가 필요하지 않으면 행복한 날이며 시퀀스를 사용할 수 있습니다.
  • 순차적 인 매니페스트 번호 (또는 데이터베이스가 시퀀스를 지원하지 않음)가 필요한 경우 적절한 잠금 장치와 함께 ID 테이블을 사용하여 각 트랜잭션이 고유 한 순차 값을 얻도록하십시오.

그런 다음 내가 생각할 수있는 두 가지 옵션이 있습니다.

  • 클라이언트에 필요한 JDBC 코드를 작성하여 사용중인 트랜잭션이 데이터베이스 업데이트와 동일하도록 (매니페스트 번호가 순차적 인 경우) 확인하십시오.
  • 트리거를 사용하여 적절한 업데이트가 발생할 때 매니페스트 번호를 작성하십시오.

나는 객체가 클라이언트에 새로 고침이 필요하다는 것을 의미하지만, 거래 측면이 처리 될 것이기 때문에 내 선호는 트리거 일 것이라고 생각합니다.

다른 팁

나는 링크 된 비슷한 솔루션을 읽지 않았지만 내가 상처를 입은 것처럼 들린다. 시퀀스를 위해 테이블을 만들었습니다. 필요한 각 시퀀스 유형에 대한 테이블에 행을 추가했습니다.

그런 다음 특정 명명 된 시퀀스의 시퀀스 값을 가져오고 업데이트하기 위해 필요한 SQL 쿼리를 수행하는 시퀀스 생성기 클래스가있었습니다.

나는 최대 절전 모드의 방언 수업을 사용하여 DB 중립적 인 방식으로 수행했습니다.

또한 시퀀스를 '캐시'할 것입니다. 저장된 시퀀스 값을 다수로 부딪친 다음 발전기 클래스에서 할당 된 시퀀스를 제거했습니다. 클래스가 파괴 된 경우 (예 : 앱 셧다운), 시퀀스 생성기의 새로운 인스턴스가 저장된 값으로 시작됩니다. (내 시퀀스 번호에 틈이 있으면 중요하지 않음)

여기 코드 Samnple이 있습니다. 나는 이것을 가지고 경고하고 싶습니다 - 나는 이것을 통합하지 않았고 그것은 스프링 코드를 다시 우아합니다. 이것을 말하면 여전히 당신이하고 싶은 일의 뼈를 제공해야합니다.

public Long getManifestNumber() {
        final Object result = getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session sess) throws HibernateException, SQLException { 
                SQLQuery sqlQuery = sess.createSQLQuery("select MY_SEQUENCE.NEXTVAL from dual");
                sqlQuery.uniqueResult();
            }
        });
        Long toReturn;
        if (result instanceof BigDecimal) {
            toReturn = ((BigDecimal)result).longValue();
        }
        return toReturn;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top