2015-02-06 7 views
0

우리는 관계형 데이터베이스에 대한 직접 쿼리를 사용하여 오늘부터 개발 된 웹 응용 프로그램에 Hibernate를 통합하고 있습니다. 우리는 읽기 및 쓰기를 위해 최대 절전 모드를 통해 데이터베이스에 액세스하기 위해 모든 엔티티와 매핑을 구현하기 위해 hbm.xml 파일을 생성했습니다.외래 키 compiste 기본 키 (중복 열 오류)

우리 스키마에는 많은 복합 기본 키가 있으며, 그 때문에이 복합 ID를 참조하는 많은 외래 키가 있습니다.

위에서 우리는 많은 문제가있는 데이터베이스 스키마의 예를 볼 수 있습니다.

<class name="Profile" table="Profile" optimistic-lock="version"> 
    <id name="profileId" type "java.lang.Integer"> 
     <column name="profileId" /> 
     <generator class="assigned" /> 
    </id> 
    <many-to-one name="location" class="Location" fetch="select" > 
     <column name="locationId" length="3" not-null="true" /> 
    </many-to-one> 
    <many-to-one name="users" class="Users" fetch="select"> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="userId" length="30" not-null="true" /> 
    </many-to-one> 
    <many-to-one name="groupUsers" class="GroupUsers" fetch="select"> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="groupUserId" length="30" not-null="true" /> 
    </many-to-one> 
</class> 

<class name="Users" table="Users" optimistic-lock="version"> 
    <composite-id name="id" class="UsersId"> 
     <key-property name="locationId" type="string"> 
      <column name="locationId" length="3" /> 
     </key-property> 
     <key-property name="userId" type="string"> 
      <column name="userId" length="30" /> 
     </key-property> 
    </composite-id> 

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="userId" length="30" not-null="true" /> 
     </key> 
     <one-to-many class="Profile" /> 
    </set> 
</class> 

<class name="GroupUsers" table="GroupUsers" optimistic-lock="version"> 
    <composite-id name="id" class="GroupUsersId"> 
     <key-property name="locationId" type="string"> 
      <column name="locationId" length="3" /> 
     </key-property> 
     <key-property name="groupUserId" type="string"> 
      <column name="groupUserId" length="30" /> 
     </key-property> 
    </composite-id> 

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="groupUserId" length="30" not-null="true" /> 
     </key> 
     <one-to-many class="Profile" /> 
    </set> 
</class> 

<class name="Location" table="Location" optimistic-lock="version"> 
    <id name="locationId" type="string"> 
     <column name="locationId" length="3" /> 
     <generator class="assigned" /> 
    </id> 

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="locationId" length="3" not-null="true" /> 
     </key> 
     <one-to-many class="Profile" /> 
    </set> 
</class> 

Tomcat을 시작할 때 나는 다음과 같은 오류 얻을 : "프로필 열 : (삽입 = 매핑해야 locationId를 =" "갱신"거짓 거짓 ")"

hbm.xml 파일도 있습니다

하지만이 Profile.hbm.xml 파일의 대일 관계에서이 두 가지 속성을 넣어하려고하면, 나는 데이터베이스에 (영향) 프로파일 인스턴스를 삽입 할 수 없습니다 :

<many-to-one name="location" class="Location" fetch="select" insert="false" update="false"> 
     <column name="locationId" length="3" not-null="true" /> 
</many-to-one> 
<many-to-one name="users" class="Users" fetch="select"insert="false" update="false"> 
     <column name="locationId" length="3" not-null="true" /> 
     <column name="userId" length="30" not-null="true" /> 
</many-to-one> 
<many-to-one name="groupUsers" class="GroupUsers" fetch="select" insert="false" update="false"> 
     <column name="locationId" length="3" not-null="true" /> 
     <column name="groupUserId" length="30" not-null="true" /> 
</many-to-one> 

을 아무도 도와 줄 수 없니?

대단히 감사합니다.

+0

왜 'locationId'가 Users 및 GroupUsers의 기본 키의 일부입니까? 그게 당신의 문제의 근원이라고 생각합니다. 다중 매핑을 위해 복합 키의 일부로 같은 열을 사용하려고합니다. 그런데 왜 이렇게할까요? 자신의 위치 만 구별되는 동일한 'userId'를 가진 여러 사용자를 갖게 될 것입니까? – dcsohl

+0

Google에서 'create hbm.xml'오류는 insert = "false"update = "false"'와 매핑되어야합니다. 예 : [one-to-many FK에서도 사용되는 composite-id key-property에 "insert = 'false'update = 'false'"를 어떻게 매핑 할 수 있습니까?] (https://stackoverflow.com/q/4892925/3404097). – philipxy

답변

0

기존 스키마에 데이터가있는 복합 기본 키가 여러 개 있고 최대 절전 모드를 추가하려고한다고 가정합니다. 대신 복합 기본 키가없는 것 같습니다.

그냥 생각 : 나는 기존의 조합 기본 키를 떨어 뜨리는 그런 큰 일이 없을 것이라고 생각 대신누구와도 바꿀 수없는 다이애나 인덱스를 만들고 순서로 모든 데이터를 업데이트 새로운 비 결합 된 기본 키를를 만들 (사용중인 DMBS에 따라 다름).

물론 최대 절전 모드를 어떻게 통합 하느냐에 달려 있습니다. 오래된 결합 된 기본 키를 유지해야 할 이유가있을 수 있습니다. 그러나 그것에 대해 생각해야합니다.