2009-09-03 3 views
4

POJO의 묶음에 주석을 달았 기 때문에 JPA는 그것을 사용하여 최대 절전 모드에서 테이블을 생성 할 수있다. "Revision"이라는 하나의 매우 중앙 테이블을 제외하고 모든 테이블이 생성 된 것처럼 보입니다. Revision 클래스는 @Entity(name="RevisionT") 주석을 가지고 있으므로 RevisionT로 이름이 바뀌므로 MySQL (대상 데이터베이스)의 예약어와 충돌하지 않습니다.테이블이 Hibernate에 의해 생성되지 않았다

전체 데이터베이스를 삭제하고 다시 만들고 기본적으로 JPA 세션을 열고 닫습니다. 모든 테이블은 아무런 문제없이 재현 된 것 같습니다.

왜 생성 된 스키마에서 하나의 테이블이 누락 되었습니까? Hibernate가 생성하는 것과 어떤 에러를보기 위해 어떤 도구가 사용될 수 있는가?

감사합니다.

업데이트 : Derby DB로 만들려고했지만 성공했습니다. 그러나 필드 중 하나에 "index"라는 이름이 있습니다. 나는 @org.hibernate.annotations.IndexColumn을 사용하여 예약어가 아닌 다른 이름을 지정합니다. 그러나 열은 생성 될 때 항상 "인덱스"라고합니다.

다음은 의심스러운 특수 효과 샘플입니다. 대신에 필드로 MasterTop.Cx3tHApe를 생성


    @ManyToOne 
    @JoinColumn(name="MasterTopID") 
    @IndexColumn(name="Cx3tHApe") 
    protected MasterTop masterTop; 

, 그것은 MasterTop.Index를 생성한다. 이름이 왜 무시됩니까?

답변

5

대답은 당신이 org.hibernate.tool.hbm2ddl.SchemaExport 테이블을 생성 할 수 있습니다

(어떤 계기 Hibernate가 생산하는 오류? 상황을 확인하기 위해 사용할 수 있습니다).

AnnotationConfiguration conf = (new AnnotationConfiguration()).configure(); 
new SchemaExport(conf).create(showHql, run); 

첫 번째 인수는 HQL이 명령이 생성하는 볼 수 있습니다 (CREATE TABLE들 등). 두 번째 것은 실제로 수정을해야하는지 (즉, 거짓 = 드라이 런)입니다.

따라서 (true, false)으로 실행하면 아무 것도 변경하지 않고 Hibernate가 테이블에 수행 할 작업을 정확하게 보여줍니다. 이 사람을 도움이 경우

+0

엄청난 도움이되었습니다! "Index"라는 이름의 컬럼이 생성되었다. 더 자세한 조사에 따르면 스키마의 @OneToMany 부분에도 @IndexColumn (name = "Index")이 있고, Hibernate는 @ManyToOne에서 @IndexColumn을 무시했다. 최대 절전 모드에서 출력. 오 잘. 작동합니다! – User1

+1

하하, 나는 그게 다행 기뻐요 :) –

2

name attribute@Entity은이 용도로 사용하지 않습니다. 대신 특수 효과를 사용하십시오.

@Entity 
@Table(name="RevisionT") 
public class Revision { 
+0

젠장, 저를 때려 : P –

+0

좋은 생각. 도움이되지 않았다. : – User1

0

잘못된 특수 효과를 사용하고 계신 것 같습니다. 일단 나는 우연히 @javax.persistence.Entity 대신에 @org.hibernate.annotations.Entity이라는 엔티티에 주석을 달았으며, Hibernate는 그것을 건너 뛰었습니다. 옆의 질문에

+0

@ javax.persistence.Entity를 사용하고 있습니다. 그러나 org.hibernate.annotations.IndexColumn이 있습니다. 주석을 혼합하면 문제가 발생할 수 있습니까? – User1

+0

아니요, 확실히 아닙니다. –

5

이 오늘 나에게 무슨 일이 있었 그리고 내가 내 개체 정의의 예약 된 단어를 사용했다 밝혀졌다 :

@OneToMany(mappedBy="list") 
@OrderColumn(name="order") 
private List<Wish> wishes; 

"순서"이 경우, 그냥이 뛰어 넘었 최대 절전 모드 수업. 따라서 사용자 정의 이름을 확인하십시오! :)

건배는, 마크

+0

내 시간을 저장 감사합니다 :) – Smrita

1

그것은 열 이름으로 인해 컬럼의 이름을 변경하여 시도 ..... 당신의 기본 데이터베이스는 SQL 예약어와 일치는 ..... 난으로 같은 문제에 직면했다 이름 변경.

1

제게는 columnDefinition의 구문 오류였습니다. 디버그 로그로 쉽게 감지 할 수 있습니다.

0

hibernate.show_sql 구성 등록 정보를 true로 설정하고 Hibernate가 create table 코드를 생성했는지 확인하십시오. 그렇다면 데이터베이스 클라이언트 (ui 또는 명령 행)에 create 문을 복사하고 데이터베이스에서 오류가 반환되는지 확인하십시오.

나를 위해 그렇게하기 전까지는 오류가 분명하지 않았습니다.

예약 된 MySQL 단어 인 'condition'필드 이름을 사용했습니다. 필드 이름을 확인하십시오 ...

관련 문제