2013-08-16 4 views
1
public String getJobNumber() { 
       String DATE_FORMAT = "yyyyMMdd"; 
       SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); 
       Calendar calendar = Calendar.getInstance(); 
       NumberFormat numberFormat = new DecimalFormat("0000000"); 
       return sdf.format(calendar.getTime()) + 
         numberFormat.format(getId()) + jobNumber; 
       } 

필드 jobNumber가 포함 된 테이블 헤더의 ID를 추적하려면 시퀀스 테이블이 필요합니다. jobNumber의 형식은 20130816 * * XXXXXX입니다.시퀀스 테이블을 사용하는 방법

jobNumber를 생성하기 위해 save에 id를 사용할 수 있다고 생각했지만 아직 저장되지 않았습니다.

나는 예외를 가지고 :

org.hibernate.PropertyAccessException: Exception occurred inside getter of com.test.model.Header.jobNumber 
내가 마지막으로 ID를 추적하기 위해 테이블 ​​(또는 뭔가 다른)를 사용할 수 있습니다 어떻게

?

프로그램은 MySQL과 Oracle 11g DB 모두에서 실행되어야합니다. 미리 감사드립니다.

답변

0

카운터를 넣으려면 표를 사용하십시오. 새 값이 필요할 때마다 테이블에서 카운터의 값을 가져 와서 증분하여 다시 테이블에 저장하고 반환하는 매우 짧은 트랜잭션을 시작하십시오. 그런 다음이 카운터에서 작업 번호를 생성하여 엔터티에 저장하십시오.

이러한 작업 번호를 자주 생성하는 경우 hilo 알고리즘과 같은 더 나은 기술을 사용하거나 카운터를 100 씩 증가시키고 메모리의 스레드 안전 캐시에 100 개의 다음 카운터 값을 유지하는 기술을 사용할 수 있습니다.

+0

캐시에로드 된 스레드 안전 카운터에 대한 코드 샘플을 제공해 주시겠습니까? 응용 프로그램이 다운되면 DB에 저장하지 않으면 정보가 손실 될 것입니다. MySQL의 경우, HI-Lo 전략은 작동하지 않습니다. – yovan786

+0

그건 연습으로 남았습니다. 정말로 필요한 경우에만하십시오. 캐시는 데이터베이스를 대체하기위한 것이 아닙니다. 그것은 데이터베이스에 너무 자주가는 것을 피하기위한 것입니다. 예를 들어 숫자를 처음으로 얻으면 처음으로 데이터베이스로 이동하여 150을 찾아서 200으로 증가시킵니다. 그런 다음 150을 반환합니다. 다음에 199까지 151, 152 등을 반환합니다. 데이터베이스를 사용하여 50 개 값의 다음 슬롯을 예약합니다. 응용 프로그램이 다운되면 항상 데이터베이스의 값에서 다시 시작됩니다. –

관련 문제