2012-11-04 3 views
0

이상한 문제가 있습니다. JPA 애플리케이션에서 테이블 생성 전략을 사용하고 있습니다. 최근까지는 JPA 구현으로 Toplink 지속성 공급자를 사용했습니다. 모두 괜찮 았어. 이제 TopLink (Table per Class Inheritance)에서 지원하지 않는 상속 기능을 추가 했으므로 EclipseLink로 이동해야했습니다. ID 생성을 제외하고 모두 정상적으로 작동합니다.@TableGenerator가 EclipseLink JPA 2.0에서 작동하지 않습니다.

@Id 
@TableGenerator(name="INCOME_SEQ", table="SEQUENCE_TABLE", pkColumnName="SEQUENCE_NAME", 
    valueColumnName="SEQUENCE_COUNT", pkColumnValue="INCOME_SEQ", allocationSize=1) 
@GeneratedValue(strategy=GenerationType.TABLE, generator="INCOME_SEQ") 
@Column(name = "INCOME_ID") 
private Integer incomeId; 

정확한 동일한 코드가 상단 링크와 함께 작동하지만 EclipseLink가 작동하지 않습니다 여기에 내 모든 고유 ID에 사용하는 코드 예제입니다. 내가 할 오류 : 테이블 이름 : SEQUENCE_TABLE

다음

내 MySQL 데이터베이스에 테이블의 설명이다

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'INCOME_ID' cannot be null 
Error Code: 1048 

그것은 전혀 사용하지 않는 테이블 생성처럼 보인다 ...

+----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+----------------+--------------+------+-----+---------+-------+ 
| SEQUENCE_NAME | varchar(64) | NO | PRI | NULL |  | 
| SEQUENCE_COUNT | int(11)  | NO |  | 0  |  | 
| localized_name | varchar(128) | YES |  | NULL |  | 
| USER_ID  | int(11)  | NO | MUL | 1  |  | 
+----------------+--------------+------+-----+---------+-------+ 

아무에게도 직접 ​​문제를 알려주십시오. 또는 적어도 ID가 생성되지 않은 실제 이유를 얻는 방법?

편집 :

+-------------------------+-------------------------------------------------------------------------------+------+-----+---------+-------+ 
| Field     | Type                   | Null | Key | Default | Extra | 
+-------------------------+-------------------------------------------------------------------------------+------+-----+---------+-------+ 
| INCOME_ID    | int(11)                  | NO | PRI | NULL |  | 
| REFERENCE_DOCUMENT_ID | varchar(32)                 | YES |  | NULL |  | 
| CLIENT_ID    | int(9)                  | NO | MUL | NULL |  | 
| income_date    | datetime                  | NO |  | NULL |  | 
| MOVEMENT_CATEGORY_ID | int(11)                  | NO | MUL | NULL |  | 
| SUM_AFTER_TAX   | decimal(10,2)                 | YES |  | 0.00 |  | 
| TOTAL_SUM    | decimal(10,2)                 | NO |  | NULL |  | 
| TAX_SUM     | decimal(10,2)                 | NO |  | 0.00 |  | 
| VAT_PERCENT    | decimal(10,2)                 | NO |  | NULL |  | 
| DESCRIPTION    | varchar(100)                 | YES |  | NULL |  | 
| STATUS     | smallint(5) unsigned               | YES |  | 0  |  | 
| REFERENCE_DOCUMENT_TYPE | enum('MANUAL_INVOICE','MANUAL_RECEIPT','INVOICE','RECEIPT','INVOICE_RECEIPT') | YES |  | NULL |  | 
| USER_ID     | int(11)                  | NO | MUL | 1  |  | 
| UNIQUE_USER_SEQUENCE | int(10) unsigned                | YES |  | NULL |  | 
+-------------------------+-------------------------------------------------------------------------------+------+-----+---------+-------+ 

편집 : 이것은 소득 클래스와 테이블 구조 나는 최고의 설정은 EclipseLink 로깅 수준 응용 프로그램을 실행,하지만, 난 여전히 아무 잘못 볼 수 없습니다. 나는 심지어 순서가 제대로 초기화되는 것을 볼 수 있습니다 : 내가 볼

[EL Finest]: 2012-11-07 20:37:00.359--ServerSession(1832413009)--Connection(1484802679)--Thread(Thread[pool-1-thread-2,5,main])--Connection released to connection pool [default]. 
[EL Finest]: 2012-11-07 20:37:00.405--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequencing connected, state is NoPreallocation_State 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequence SEQ_GEN_IDENTITY: preallocation size 1 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequencing connected, state is Preallocation_Transaction_NoAccessor_State 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequence RECEIPTS_SEQ: preallocation size 1 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequence INCOME_SEQ: preallocation size 1 

    [EL Finest]: 2012-11-07 20:38:09.264--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--persist() operation called on: 555 וובה. 
[EL Finer]: 2012-11-07 20:38:09.265--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--begin unit of work commit 
[EL Finest]: 2012-11-07 20:38:09.288--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--Execute query DoesExistQuery(referenceClass=MovementCategories) 
[EL Finest]: 2012-11-07 20:38:09.29--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--Execute query InsertObjectQuery(חש' ידנית 555 וובה) 
[EL Finest]: 2012-11-07 20:38:09.291--ServerSession(1832413009)--Connection(1484802679)--Thread(Thread[AWT-EventQueue-1,6,main])--Connection acquired from connection pool [default]. 
[EL Finer]: 2012-11-07 20:38:09.291--ClientSession(2117615354)--Connection(1484802679)--Thread(Thread[AWT-EventQueue-1,6,main])--begin transaction 
[EL Fine]: 2012-11-07 20:38:09.293--ClientSession(2117615354)--Connection(1484802679)--Thread(Thread[AWT-EventQueue-1,6,main])--INSERT INTO income (INCOME_ID, DESCRIPTION, INCOME_DATE, REFERENCE_DOCUMENT_ID, REFERENCE_DOCUMENT_TYPE, STATUS, SUM_AFTER_TAX, TAX_SUM, TOTAL_SUM, UNIQUE_USER_SEQUENCE, VAT_PERCENT, CLIENT_ID, MOVEMENT_CATEGORY_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
    bind => [null, null, 2012-11-07 20:37:55.225, 555, MANUAL_INVOICE, 1, 100.0, 16.5, 116.5, null, 16.5, 334, 3] 

유일한 단서는이 Preallocation_Transaction_NoAccessor_State 재산 ... 어쩌면 누군가가 나이를 이해하는 데 도움이됩니다. 시퀀싱 된 기본 키 ID의 경우 로깅 출력은 무엇이되어야합니까?

+1

여기에 Eclipselink 로깅이 설명되어 있습니다. http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging 최고 수준으로 시도하십시오. – Chris

+0

좋아요, 로깅 결과가 있습니다 (해당 링크에 대한 감사 ...). 기본 질문에 결과를 추가했습니다. – Vova

+0

ID가 순서 지정을 사용하는 것처럼 보이지 않고 수입에 대한 전체 클래스 매핑을 포함하고 orm.xml이 주석을 다시 정의하는지 확인하고 올바르게 작성되었는지 확인하십시오 코드 컴파일 및 배포 – James

답변

0

로그에서 오류 및 SQL 실패를 확인하십시오.

테이블 def에는 몇 가지 다른 열이 있습니까?

USER_ID는 JPA에 알려준 내용이 아니며 null이 아니므로 오류가 발생할 수 있습니다.

여전히 문제가있는 경우 자세한 내용을 포함하십시오.

+0

내가 포함 된 오류 스 니펫은 SQL 오류가 데이터를 삽입 할 때 income_id 인 기본 키 열이 NULL임을 알리는 것을 보여줍니다. user_id 열은 기본값이 '1'이므로 정의하지 않는 것이 문제가되지 않으며 기본값은 '1'입니다. JPA Provider로 Toplink를 사용했을 때 똑같은 코드 (정확히 동일한 DB와 함께)가 완벽하게 작동했음을 언급해야합니다. 더 많은 로그 작성 - 알고 계십니까 EclipseLink의 자세한 로그를 추출하는 방법은 무엇입니까? – Vova

+1

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging – James

0

있는 솔루션이 좀 더 사람들을 위해 도움이 될 것입니다 희망 : 내 지속성 단위에 대해 다음과 지속성 구성 설정 세트를 가지고 몇 가지 이유 :

persistenceMap.put(PersistenceUnitProperties.ID_VALIDATION,"NONE"); 

은 분명히도는 EclipseLink에서 ID 확인을 해제 ID 생성을 끕니다.

도와 주신 모든 분들께 감사드립니다.

관련 문제