2009-10-14 3 views
8

이 문제는 해결해야 할 초보적 인 문제입니다. 그러나 1) 나는 Hibernate에 비교적 익숙하지 않습니다. 2) 발견 한 수정 사항이 여기에 적용되지 않습니다. . 최대 절전 모드 자체를 구성하려고 할 때최대 절전 모드 : 매핑되지 않은 클래스 연결 예외

org.hibernate.MappingException: An association from the table POSTS refers to 
an unmapped class: com.beans.User at 
org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1285)

이 발생 : 여기

내가 점점 오전 예외입니다.

내가 작업중인 객체는 사용자, 게시물 (추상 수퍼 클래스), 상태 및 설명 (Post의 구체적인 하위 클래스)입니다. 각각 USERS와 POSTS의 두 테이블 중 하나의 빈입니다. User 객체는 꽤 바닐라입니다. 비슷한 지루한 필드 외에도 상태 및 설명에는 소유자 (게시 한 사용자)가 있습니다. 댓글과 상태를 구분하는 것은 상태에 댓글이 붙어 있지만 부모는 없지만 댓글에는 아이 게시물이 없지만 부모가 있습니다 (예, 기본적으로 Facebook입니다).

내가 읽은 바로는이 문제는 다 대일 매핑에있는 것 같지만 잘못된 것을 찾지 못하는 것 같습니다. 다음은 내가 사용하고있는 세 가지 구성 파일입니다.

있는 hibernate.cfg.xml :

 
<hibernate-configuration> 
    <session-factory> 
     ... 
     <!-- mapped persistence classes --> 
     <mapping resource="User.hbm.xml" /> 
     <mapping resource="Post.hbm.xml" /> 
    </session-factory> 
</hibernate-configuration>

User.hbm.xml :

 
<hibernate-mapping> 
    <class name="com.beans.User" entity-name="User" table="USERS" proxy="User"> 
     <id name="uid" type="java.lang.Integer"> 
      <column name="uid" /> 
      <generator class="assigned" /> 
     </id> 
     ... 
    </class> 
</hibernate-mapping>

Post.hbm.xml : 내가 필요 느낌을 얻을

<hibernate-mapping> 
    <class name="com.beans.Post" entity-name="Post" table="POSTS" proxy="Post" abstract="true"> 
     <id name="pid" type="java.lang.Integer"> 
      <column name="pid" /> 
      <generator class="assigned" /> 
     </id>    
     <discriminator column="type" /> 
     <one-to-one name="parent" class="com.beans.Post"></one-to-one> 
     <many-to-one name="owner" class="com.beans.User" update="false" fetch="select"> 
      <column name="owner" /> 
     </many-to-one> 
     <property name="postDate" type="java.sql.Timestamp" update="false"> 
      <column name="post_date" /> 
     </property> 
     <property name="content" type="java.lang.String" update="false"> 
     <column name="content" /> 
     </property> 
     <property name="type" type="string" update="false"> 
     <column name="type" /> 
     </property> 

     <subclass name="com.beans.Status" discriminator-value="status"> 
     <list name="children" inverse="false" table="POSTS" lazy="true"> 
       <key column="pid" /> 
      <index /> 
      <one-to-many class="com.beans.Comment" /> 
    </list> 
     </subclass> 

     <subclass name="com.beans.Comment" discriminator-value="comment"></subclass> 
    </class> 
</hibernate-mapping> 

Status에 Comment의 ArrayList가 포함되어 있지만 Post.hbm.xml의 "list"구문을 통해 암시 적으로 수행되지는 않습니다. ile?

xml 파일은 내 클래스 경로 (WEB-INF/classes)에 존재하며 .java 파일 자체는 응용 프로그램에서도 볼 수 있습니다. 통찰력은 인정 될 것입니다!

답변

17

게시 한 예외는 <class> 선언에 명시 적으로 엔티티 이름을 지정하고 <many-to-one>에 지정하지 않아서 발생합니다. 개체 이름은 동일한 클래스를 기반으로 서로 다른 매핑을 구별하는 데 사용되는 special attribute입니다. 매핑을 위해 필요하지 않습니다. 부모

  1. <one-to-one> 매핑이 잘못되어 말했다

    , 당신의 매핑 여러 추가적인 문제가 있습니다. 게시물에는 하나의 상위 항목 만 있지만 다른 게시물에는 상위 항목 (특히 주석 용)이있어 상위 항목의 1 대 다수를 끝낼 수 있습니다. 대신 <many-to-one>으로 매핑해야합니다.

  2. 색인을 유지 관리하는 특별한 열이 없다면 주석 목록은 실제로 목록이 아닙니다 (공백으로 판단하지 않는 - <index/> 선언). 대신 <bag>으로 매핑하십시오.
  3. 댓글 목록은 실제로 inverse = true로 매핑되어야합니다.
  4. 그 자체로 문제는 아니지만 매핑을 읽기가 어렵게 만듭니다. 중첩 된 요소가 필요 없습니다. <column> 요소입니다. 대신 속성으로 가질 수도 있고, 열 이름이 특성 이름과 일치하는 경우에는이를 건너 Y십시오.마찬가지로, 어디서나 update = false가없는 지점 - 게시물을 업데이트하지 않으려면 저장하지 마십시오 :-)
+2

와우, 정말 고마워요! 당신의 제안을 따랐을 때 적어도 Hibernate 구성의 다른 측면을 엉망으로 만들지 않으면 서 적어도 12 개의 새로운 예외를 순차적으로 처리해야했기 때문에이 프레임 워크에 대해 배울 점이 상당히 있음을 알 수 있습니다. 이번에는 실수가 더 간단하고 모든 것이 작동하는 것 같습니다 :) 이것은 처음으로 최대 절전 모드로 구동되는 응용 프로그램이며 학습 3 일만에 숨을 쉬고 있습니다! 당신의 도움을 주셔서 대단히 감사합니다! – Magsol

+3

당신은 Hibernate와 함께 행운을 빈다. 처음에는 조금 힘들지만 잠시 후 제 2의 천성이됩니다. 그리고 3 일 만에 문제가 해결되었다는 사실을 알게되면 앞으로도 많은 문제가 발생하지 않을 것입니다. – ChssPly76

2

나를 위해이 문제는 매핑 대신 속성을 참조하려고 시도하여 발생했습니다 그것.

유창한 구문에서 나는 이것을하고 있었다 (잘못했다!).

mapping.References(x => x.AdvertExpiryDays).Not.Nullable(); 

오히려이 (올바른!).

mapping.Map(x => x.AdvertExpiryDays).Not.Nullable(); 

여기에서 AdvertDpiryDays는 엔터티가 아닙니다.

관련 문제