표 PersonAddress에서 연관 매핑되지 않은 클래스를 의미

cjq \ 최대 절전 모드 \ 튜토리얼 \ domain01 \ Person.hbm.xml로 파일의 내용 :

<? XML 버전 = "1.0"?>
<DOCTYPE 최대 절전 모드 매핑을 PUBLIC!
        "- // 최대 절전 모드 / 최대 절전 모드 매핑 DTD 3.0 // EN"
        " http://www.hibernate.org/dtd/hibernate-mapping-3.0. DTD ">

<최대 절전 모드 매핑 패키지 = "cjq.hibernate.tutorial.domain01">
 <클래스 명 = "사람">
  <아이디 이름 = "ID"열 = "personId">
   <generator 클래스 = "기본"/>
  </ ID>
  <표 = "PersonAddress"옵션 = "true"로 가입>
   <키 열 = "personId"/>
   </ not-null = "true"를 "addressId"= 대일 이름 = "주소"열>
  </ 가입 >
 </ 클래스>
 
 <클래스 명 = "주소">
  <ID NAME = "ID"열 = "addressId">
   <발생기 클래스 = "네이티브"/>
  </ ID>
 </ 클래스>

</ 최대 절전 모드 매핑>

Person.java

패키지 cjq.hibernate.tutorial.domain01;

가져 오기는 java.util.HashSet;
수입 java.util.Set을;

공용 클래스 사람 {
 INT 아이디;
 INT 주소;
 공공 INT getId () {
  반환 아이디;
 }
 공개 무효 setId (INT 아이디) {
  this.id = ID;
 }
 공공 INT getAddress에 () {
  반환 주소;
 }
 공개 무효 setAddress (INT 주소) {
  this.address = 주소;
 }
}

Address.java
패키지 cjq.hibernate.tutorial.domain01;

공용 클래스 주소 {
 INT 아이디;

 공공 INT getId () {
  반환 아이디;
 }

 공공 무효 setId (INT 아이디) {
  this.id = ID;
 }
 

}

MyTest.java

패키지 cjq.hibernate.tutorial.domain01;

가져 오기는 java.util.HashSet;
수입 java.util.Set을;

가져 오기가 org.hibernate.Session;

수입 cjq.hibernate.tutorial.util.HibernateUtil;

공용 클래스 MYTEST {
 공공 정적 무효 메인 (문자열 []에 args) {
  . 세션 세션 = HibernateUtil.getSessionFactory ()과 getCurrentSession ()에 ();
  session.beginTransaction ();
  ) (A = 새 주소 주소;
  session.save (a);
  주소 b = 새 주소 ();
  session.save (b);  
  사람 P1 = 새로운 사람 ();  
  p1.setAddress (a.getId ());
  session.save (P1);
  사람의 P2 = 새로운 사람 ();
  p2.setAddress (a.getId ());
  session.save (P2);
  session.getTransaction () 커밋 ().;
  HibernateUtil.getSessionFactory ()과 () close ()를.;
 }

}


MyTest.java运行
此时报错:
초기 SessionFactory를 생성 failed.org.hibernate.MappingException : INT의 : PersonAddress가 매핑되지 않은 클래스 참조하는 테이블에서 연관
스레드 "메인"java.lang.ExceptionInInitializerError 예외
 cjq.hibernate.tutorial에서. util.HibernateUtil.buildSessionFactory (HibernateUtil.java:27)
 cjq.hibernate.tutorial.util.HibernateUtil에서 <clinit> (HibernateUtil.java:15).
 cjq.hibernate.tutorial.domain01.MyTest.main (MyTest.java에서 : 12)
org.hibernate.MappingException : 의해 야기 PersonAddress가 매핑되지 않은 클래스를 지칭 테이블 연관 : INT
 org.hibernate.cfg.Configuration.secondPassCompileForeignKeys에서 (Configuration.java:1697)
 org.hibernate.cfg.Configuration.originalSecondPassCompile (Configuration.java:1631)에서
 org.hibernate.cfg.Configuration.secondPassCompile (Configuration.java:1366)에서
 org.hibernate.cfg.Configuration.buildSessionFactory에서 (Configuration.java:1731 )
 org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1782)에서
 cjq.hibernate.tutorial.util.HibernateUtil.buildSessionFactory에서 (HibernateUtil.java:23)
 ... 2 개


분석 후, Person.java는 주소 유형은 인터넷 용하지 않아야하지만, 주소 타입이어야
Person.java과 같이 수정 :
패키지 cjq.hibernate.tutorial.domain01;

가져 오기는 java.util.HashSet;
수입 java.util.Set을;

공용 클래스 사람 {
 INT 아이디;
 주소 주소;
 공공 INT getId () {
  반환 아이디;
 }
 공개 무효 setId (INT 아이디) {
  this.id = ID;
 }
 공공 주소 getAddress에 () {
  반환 주소;
 }
 공개 무효 setAddress (주소 주소) {
  this.address = 주소;
 }
}


동시에, MyTest.java 내용은 그에 따라 수정 :
패키지 페널티를 cjq.hibernate.tutorial.domain01 위해;

가져 오기는 java.util.HashSet;
수입 java.util.Set을;

가져 오기가 org.hibernate.Session;

수입 cjq.hibernate.tutorial.util.HibernateUtil;

공용 클래스 MYTEST {
 공공 정적 무효 메인 (문자열 []에 args) {
  . 세션 세션 = HibernateUtil.getSessionFactory ()과 getCurrentSession ()에 ();  
  session.beginTransaction ();  
  ) (A = 새 주소 주소;  
  session.save (a);  
  주소 b = 새 주소 ();
  session.save (b);  
  사람 P1 = 새로운 사람 ();
  p1.setAddress (a);
  session.save (P1);
  사람의 P2 = 새로운 사람 ();
  p2.setAddress (a);
  session.save (P2);
  session.getTransaction () 커밋 ().;
  HibernateUtil.getSessionFactory ()과 () close ()를.;
 }

}

이 경우, 실행 MyTest.java의
: 오류 메시지가 출력됩니다
ERROR : HHH000388 : 실패 : 표 PersonAddress합니다 (personId 번호 (10,0) Null이 아님 UNIQUE, AddressID 번호 (10,0) NULL이 아닌, 기본 키합니다 (personId 만들기) )
2012년 8월 25일 오후 11시 10분 25초 org.hibernate.tool.hbm2ddl.SchemaUpdate 실행
오류 : ORA-02261가 : 테이블은 고유 키 또는 기본 키가있다

Bayue 25, 2012 11시 10분 25초 org.hibernate.tool.hbm2ddl.SchemaUpdate의 오후에 실행
오류 : HHH000388을 : 실패 다음 ALTER 테이블 PersonAddress이 (가) 참조 사람을 외래 키 제약 FKA81B4EBF9A4AE9FE합니다 (personId)를 추가
년 8 월 25 일, 2012 11시 10분 25초 실행] 오후 org.hibernate.tool.hbm2ddl.SchemaUpdate의
ERROR : ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다

Bayue 25, 2012 11시 10분 25초 org.hibernate.tool.hbm2ddl.SchemaUpdate의 오후에 실행
오류 : HHH000388을 : 실패 다음 ALTER는 테이블이 (가) 외래 키 제약 FKA81B4EBF945FDFAA (AddressID)를 추가 PersonAddress 참조가 주소
년 8 월 25 일, 2012 11시 10분 25초 실행] 오후 org.hibernate.tool.hbm2ddl.SchemaUpdate의
ERROR : ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다

八月25, 2012 11시 10분 25초下午org.hibernate.tool.hbm2ddl.SchemaUpdate 실행
정보를 : HHH000232 : 스키마 업데이트를 완료
Hibernate는 : 이중에서 hibernate_sequence.nextval 선택
최대 절전 모드 : 이중에서 hibernate_sequence.nextval 선택
최대 절전 모드 : 선택 hibernate_sequence.nextval 이중에서
최대 절전 모드 : 이중에서 hibernate_sequence.nextval 선택
최대 절전 모드 : 주소에 삽입 (addressId) 값 (?)
최대 절전 모드 : 주소에 삽입 (addressId) 값 (?)
최대 절전 모드 : 사람 (personId) 값을 삽입 (?)
최대 절전 모드 : 삽입 (?) PersonAddress (addressId, personId) 값
八月25, 2012 11시 10분 26초下午org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions는
WARN : SQL 오류 : 942, SQLState의를 : 42000
2012년 8월 25일 오후 11시 10분 26초 logExceptions org.hibernate.engine.jdbc.spi.SqlExceptionHelper의
ERROR : ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다

스레드에서 예외 "주요"org.hibernate.exception.SQLGrammarException : ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다

 org.hibernate.exception.internal.SQLStateConversionDelegate.convert (SQLStateConversionDelegate.java:122)에서
 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert에서 (StandardSQLExceptionConverter.java:49)
 org.hibernate.engine.jdbc.spi.SqlExceptionHelper에서 .convert (SqlExceptionHelper.java:125)
 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:110)에서
 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation에서 (AbstractStatementProxyHandler.java : 129)
 org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke (AbstractProxyHandler.java:81)에서
 $ Proxy6.executeUpdate에서 (알 수없는 소스)
 org.hibernate.persister.entity.AbstractEntityPersister.insert (AbstractEntityPersister.java:2862)에서
 org.hibernate.persister.entity.AbstractEntityPersister.insert에서 (AbstractEntityPersister.java:3300)
 org.hibernate.action.internal.EntityInsertAction.execute에서 (EntityInsertAction.java:88)
 org.hibernate.engine.spi.ActionQueue.execute에서 (ActionQueue.java:362)
 org.hibernate.engine.spi.ActionQueue.executeActions에서 (ActionQueue.java:354)
 org.hibernate에서. engine.spi.ActionQueue.executeActions (ActionQueue.java:275)
 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions에서 (AbstractFlushingEventListener.java:326)
 org.hibernate.event.internal.DefaultFlushEventListener.onFlush (DefaultFlushEventListener.java에서 : 52)
 org.hibernate.internal.SessionImpl.flush (SessionImpl.java:1214)에서
 org.hibernate.internal.SessionImpl.managedFlush에서 (SessionImpl.java:403)
 org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit에서 (JdbcTransaction.java:101)
 org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit에서 (AbstractTransactionImpl.java:175)
 cjq.hibernate.tutorial.domain01.MyTest.main에서 (MyTest.java:36)에
의해 발생 : java.sql.SQLException의 : ORA-00942 :表或视图不存在

 oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:112)에서
 oracle.jdbc.driver.T4CTTIoer.processError (T4CTTIoer.java:331)에서
 oracle.jdbc.driver.T4CTTIoer.processError에서 (T4CTTIoer.java:288 )
 oracle.jdbc.driver.T4C8Oall.receive (T4C8Oall.java:745)에서
 oracle.jdbc.driver.T4CPreparedStatement.doOall8 (T4CPreparedStatement.java:216)에서
 oracle.jdbc.driver.T4CPreparedStatement.executeForRows에서 (T4CPreparedStatement.java : 966)
 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:1170)에서
 oracle.jdbc.driver.OraclePreparedStatement.executeInternal (OraclePreparedStatement.java:3339)에서
 oracle.jdbc.driver.OraclePreparedStatement.executeUpdate에서 (OraclePreparedStatement.java : 3423)
 sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법)에서
 sun.reflect.NativeMethodAccessorImpl.invoke에서 (NativeMethodAccessorImpl.java:57)
 sun.reflect.DelegatingMethodAccessorImpl.invoke에서 (DelegatingMethodAccessorImpl.java:43)
 java.lang.reflect.Method의에서 .invoke (Method.java:601)
 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation에서 (AbstractStatementProxyHandler.java:122)
 ... 15 개


주의 사항 : 작성 테이블 PersonAddress (personId 번호 (10,0) 널 (null) 고유하지, addressId 번호 (10,0) NOT NULL, 기본 키 (personId)) 다음은 테이블 문 건설, 기본 키가 null 독특한 중복되지 않습니다.

查看Person.hbm.xml로,发现:
<표 = "PersonAddress"옵션 = "true"로 가입>
   <키 열을 = 고유 = "진정한"/ "personId">
   <대일 이름 = "주소"열 = " /> "addressId"null이되지 = "진정한
  > </ 가입

此处的독특한应该去掉= "true"로 :
<표 = "PersonAddress"옵션 = "true"로 가입>
   <키 열 = "personId"/>
   <대일 이름 = "주소"열을 = 없습니다 "addressId" -null = "진정한"/>
  </ 가입>

다시 실행 MyTest.java
오른쪽에.

HTTPS : //my.oschina.net/u/2552902/blog/543860 재현

추천

출처blog.csdn.net/weixin_33882452/article/details/92327067