2013-03-03 2 views
1

를 사용하는 경우 법인은 지속되지 :나는 다음과 같은 필드 주석을 사용하고 JPA

@Id
@TableGenerator(name = "comment_sequence", pkColumnValue = "comment_sequence")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "comment_sequence")
private Long id_comment;

테이블을 작성하는 SQL은 다음과 같습니다

CREATE TABLE hibernate_sequences (sequence_name VARCHAR(255) NOT NULL, next_val bigint, PRIMARY KEY (sequence_name));
INSERT INTO hibernate_sequences VALUES ('comment_sequence', 1);

그러나 기업은 단순히되지 않습니다 지속. 무슨 일이 일어날 지 생각해? 위에서 제시 한 코드에 문제가 있습니까?


이 편집 :

내가 원래의 게시물에 몇 가지 정보를 억제, 나는 (거의 =/자고 한밤중에 요청) 죄송합니다.

엔티티가 제대로 나는 SEQUENCE로 전략을 변경하고 CREATE SEQUENCE hibernate_sequence 모든 것이 (이 유지됩니다) 잘 작동하는 SQL을 추가 할 경우, 생성,하지만 난에 행에 각 테이블의 순서를 유지하기 위해 TABLE 전략을 사용할되고있다 hibernate_sequences.

유일한 예외는 통합 테스트에서 실패한 테스트로 인한 NullPointerException 때문에 TransactionRolledbackException입니다. 왜 데이터를 삽입하지 않는지에 대한 명시 적 정보가 없습니다. 이 관련 될 수있는 경우

... 

12:38:48,753 INFO [stdout] (pool-5-thread-1) Hibernate: 
12:38:48,754 INFO [stdout] (pool-5-thread-1)  insert 
12:38:48,755 INFO [stdout] (pool-5-thread-1)  into 
12:38:48,756 INFO [stdout] (pool-5-thread-1)   cm_comment 
12:38:48,757 INFO [stdout] (pool-5-thread-1)   (cd_status, ds_message, dt_alt, dt_inc, id_user_alt, id_user_inc, id_problem, id_comment) 
12:38:48,758 INFO [stdout] (pool-5-thread-1)  values 
12:38:48,759 INFO [stdout] (pool-5-thread-1)   (?, ?, ?, ?, ?, ?, ?, ?) 

12:38:48,766 INFO [stdout] (pool-5-thread-1) Hibernate: 
12:38:48,766 INFO [stdout] (pool-5-thread-1)  select 
12:38:48,767 INFO [stdout] (pool-5-thread-1)   commentent0_.id_comment as id1_6_, 
12:38:48,768 INFO [stdout] (pool-5-thread-1)   commentent0_.cd_status as cd2_6_, 
12:38:48,770 INFO [stdout] (pool-5-thread-1)   commentent0_.ds_message as ds3_6_, 
12:38:48,771 INFO [stdout] (pool-5-thread-1)   commentent0_.dt_alt as dt4_6_, 
12:38:48,772 INFO [stdout] (pool-5-thread-1)   commentent0_.dt_inc as dt5_6_, 
12:38:48,773 INFO [stdout] (pool-5-thread-1)   commentent0_.id_user_alt as id6_6_, 
12:38:48,774 INFO [stdout] (pool-5-thread-1)   commentent0_.id_user_inc as id7_6_, 
12:38:48,775 INFO [stdout] (pool-5-thread-1)   commentent0_.id_problem as id8_6_ 
12:38:48,776 INFO [stdout] (pool-5-thread-1)  from 
12:38:48,777 INFO [stdout] (pool-5-thread-1)   cm_comment commentent0_ 
12:38:48,778 INFO [stdout] (pool-5-thread-1)  where 
12:38:48,779 INFO [stdout] (pool-5-thread-1)   commentent0_.id_problem=? 

12:38:48,840 ERROR [org.jboss.arquillian.protocol.jmx.JMXTestRunner] (pool-5-thread-1) 
... 

java.lang.AssertionError: expected:<1> but was:<0> 

... 

나는 확실하지 않다하지만 이전 테스트에서 나는 오류 얻을 :

hibernate.show_sql = true를 사용할 때 다음과 같은 최대 절전 모드의 출력을 얻을

12:50:36,510 INFO [org.jboss.as.ejb3] (pool-4-thread-1) JBAS014101: Failed to find SFSB instance with session ID {[-98, -17, -32, -33, 63, 107, 74, 59, -76, -127, -19, 29, 24, 45, -50, 5]} in cache

나는 을 log_statement = 'all'으로 변경하고 어떤 로그도 보지 않은 채로 앱을 실행 한 후 pg_log 디렉토리를 체크인합니다. 그래서 나는 그 옵션을 어떻게 사용할 수 있을지 확신하지 못합니다.

또한 Arquillian, arquillian 지속성 API 및 JBoss 관리 인스턴스를 사용하여 통합 테스트를 수행하고 있습니다. 태그 중 일부와 관련 될 수 있으므로 태그를 업데이트 할 예정입니다. TableGenerator

+5

예, 작동하지 않는다는 사실을 근거로 뭔가 잘못하고있는 것입니다. 이보다 더 많은 것을 원한다면 더 많은 코드와 구성은 물론 오류가 발생할 수도 있습니다. 바람직하게는 [SSCCE] (http://sscce.org/)를 제공하십시오. –

+0

엔티티를 생성 했습니까? 당신은 그것을 지속 했습니까? 우리는 그 어떤 것도 볼 수 없습니다. 또한 PostgreSQL에서'log_statement'를 활성화 한 다음 PostgreSQL 로그 파일에서 관련있는 명령문 및 오류를 검사해야합니다.코드에서 예외를 삼가 지 않도록하십시오. –

+0

@RyanStewart 나는 그것이 "위에 제시된 코드에 문제가 있습니까?"라는 암시라고 생각했습니다. @CraigRinger 나는 조금 더 설명하는 나의 포스트를 편집 할 것이다, 나는 단지 코드의 부분이 뭔가 잘못 될 수 있다고 생각했다. 왜냐하면 내가 전략을'SEQUENCE'로 바꾸면 모든 것이 잘 작동하기 때문이다. –

답변

2

귀하의 "선언"은/사용에서 검색해야하는 테이블에 대한 정보를 제공하지 않는, 모든 당신은 .... 그것이 pkColumn 이름입니다 제공하고

시도 :

@TableGenerator( name = "comment_sequence", table = "hibernate_sequences", pkColumnName = "sequence_name", valueColumnName = "next_val", pkColumnValue = "comment_sequence", allocationSize=1)

allocationSize=1은 실제로 작동하는지 확인한 후 1보다 커야합니다. (이 줄을 사용하면 응용 프로그램이 "많은"엔터티를 만드는 경우이 전략을 사용하고 많은 수의 생성기를 db의 동일한 테이블에 넣으면 잠재적 인 잠금 문제가 있음을 알고 있어야합니다.)

+0

'allocationSize'를 1로 변경하면 작동합니다. 문제는 각 테스트에서 시퀀스 테이블을 제거한 후 테스트에서 찾는 다음 시퀀스가 ​​1이라고 가정하고있었습니다. 아마도 값 50이 메모리에 잠겨 있습니다. 왜 그런 일이 일어나는지 알아 내려고 노력 중입니다. 그리고 시퀀스에 대해서는 잠금을 피하기 위해 각 엔티티마다 하나의 테이블을 사용하는 것이 좋습니다. –

+0

나는 이유/방법을 말할 수 없다. 아마 arquillian을 "구성"하고이 특정 테스트를 작성하는 방법과 관련이있을 것이다. 이모, 엔티티의 ID 부분을 생성하는 시퀀스에 대해 실제로 아무것도 테스트하지 않고있는 각각의 테스트에서 시퀀스 테이블을 삭제/다시 만들고 있기 때문에 그다지 신경 써서는 안됩니다. .... 아니요, 나의 탁월함 테이블 생성기는 훌륭합니다 (잘못된 구성의 잠금 문제 만 보았습니다). 알고있는 것이 좋지만 쓰기 (잠금)는 자신의 db-transaction에있는 한 매우 짧아야합니다 (JPA 구현에 따라 구성하는 방법을 생각합니다) – esej

+0

응답을 편집하면 'allocationSize = 1'이 해결책이라는 것을 알았다면, 나는 그것을 받아 들일 것입니다. –