2008-12-30 2 views
4

나는 최대 절전 모드 매핑이최대 절전 모드 및 통화 정밀

private int id; 
private Date date; 
private int customerId; 
private int schoolId; 
private float bookFee; 
private float adminFee; 
private float totalFee; 

나는이 테이블에 삽입을 할 때, 다음 오류가 발생합니다.

Hibernate: insert into INVOICE (INVOICE_DATE, CUSTOMER_ID, SCHOOL_ID, BOOK_FEE, ADMIN_FEE, TOTAL_FEE, ID) values (?, ?, ?, ?, ?, ?, ?) 
50156 [AWT-EventQueue-0] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 22001 
50156 [AWT-EventQueue-0] ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data truncated for column 'ADMIN_FEE' at row 1 
50156 [AWT-EventQueue-0] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session 

adminFee의 유형을 double로 변경하려고 시도했지만 그 중 하나도 작동하지 않았습니다. 문제는, Hibernate가 실제로 insert를 제대로 수행 했었고, 미래의 select 문이 현재의 값 집합을 반환하지만,이 오류로 인해이 송장에 대한 추가 처리를 할 수 없다는 것입니다.

필드 bookFee, adminFee 및 totalFee는 모두 통화로 간주됩니다. 그것들은 십진수 (5,2)로 MySQL 데이터베이스에 정의됩니다.

이 문제를 해결하는 방법에 대한 도움을 주시면 매우 감사하겠습니다.

+0

우선, 실제 SQL 쿼리를 표시하도록 최대 절전 모드를 구성하십시오. 그것은 매우 도움이 될 것입니다. –

+0

10 진수 5,2로 정의 했습니까? 아니면 최대 절전 모드일까요? – Uri

+0

그랬지만 대부분의 데이터를 상속 받았다. 너무 많은 옵션이 없었다. – Elie

답변

5

나는 정수형 (INT, 긴)를 사용합니다. 오랫동안 오버플로를 피할 수있는 사람에게는 재미있는 문제가 없습니다.

+5

불행히도 미국 재무부는 장기적인 오버 플로우 위험을 높입니다. – duffymo

+3

실제로 이들은 언더 플로우가 오래 걸릴 가능성이 큽니다. – Elie

1

유형을 할당 해 보셨습니까?

<property name="adminFee" column="ADMIN_FEE" type="float"/> 

데이터의 정밀도에 문제가있는 것 같습니다. 1.26666666666이있을 때 ... 값이 잘립니다.

삽입을 시도하기 전에 반올림 할 수도 있습니다.

참조 : http://bugs.mysql.com/bug.php?id=7829 또한

,이 도움이 있는지 확인 : (에서와 같이 법을 위반하거나 적어도 규정에서) 부동 소수점 또는 돈을 위해 이중 사용 http://www.ibm.com/developerworks/java/library/j-jtp0114/

+0

형식을 부동으로 설정하려고했지만 여전히 동일한 오류가 발생합니다. – Elie

12

절대적으로 inacceptable하고도 불법 일 수도있다. 이를 수정해야 오류가 사라집니다. float는 정밀도가 제한되어 있으며 대부분의 소수 자릿수를 정확하게 나타낼 수 없습니다.

For money, always, ALWAYS use BigDecimal.

+0

가장 기본적이고 양자화 된 단위 (예 :, 일본 화폐의 경우 엔, 미국의 경우 센트), 분수를 모두 피할 수 있습니다. – duffymo

+0

BigDecimal을 사용해 보았습니다 ... 모든 수학이 엉망이 됐고 이제는 모든 필드에 0 만 저장됩니다. – Elie

+0

아, 그리고이 특정 응용 프로그램과 법적 문제가 없습니다, 숫자는 다음 큰 정수로 끝내지만, 그들은 정확하게 저장 싶습니다. 고객은이를 알고 있습니다. – Elie

0

float, BigDecimal 또는 double을 사용하지 않게되었습니다. 나는 고객에게 돌아갔다. 그리고 그들은 고객이 항상 둥근 그림을 청구했기 때문에 동전을 떨어 뜨리기로 동의했다. 그래서 동전을 저장할 필요가 없다. 그러나, 나는 통화를 제대로 저장하는 방법을 알아야 할 것입니다. 통화가 다시 올 가능성이 있기 때문입니다.

0

사용자 정의 Hibernate 매핑과 클래스 정의가 좋은 방법입니다.

+0

하지만 어떤 유형이 있습니까? 숫자 (5,2)는 Java 형식에서 무엇으로 매핑됩니까? – Elie