2015-12-30 14 views
6

Ich habe solche DB-Beziehung.
db schemeViele-zu-viele Hibernate XML-Konfiguration

Ich möchte viele-zu-viele Beziehung haben. Zwischen PLAYER und PRIVILEGE. Könnten Sie mir bitte helfen, meine .xml-Konfigurationen zu reparieren.

Erwartetes Ergebnis: Ich möchte ausführen können: String hql = "from Player as p right outer join p.privilages as priv";

Aktuell: So bekomme ich weit:

org.hibernate.MappingException: Fremdschlüssel (FK8CD18EE134F64423: SPIELER [ID])) muss dieselbe Anzahl von Spalten haben wie der referenzierte Primärschlüssel (PRIVILAGE [ID, PRIVILAGE])

<hibernate-mapping> 
    <class name="model.Privilage" table="PRIVILAGE"> 
     <id name="id" type="int" > 
      <column name="ID" precision="5" scale="0"/> 
      <generator class="increment"/> 
     </id> 

     <set name="players" table="PLAYER" 
      inverse="false" lazy="true" fetch="select" cascade="all" > 
      <key> 
       <column name="ID"/> 
      </key> 
      <many-to-many entity-name="model.Player"> 
       <column name="ID" not-null="true" /> 
      </many-to-many> 
     </set> 

     <property name="privilage" type="string"> 
      <column name="PRIVILAGE" length="20" not-null="true" /> 
     </property> 
    </class> 
</hibernate-mapping> 

und

<class name="model.Player" table="PLAYER"> 
    <id name="playerId" type="int" > 
     <column name="ID" precision="5" scale="0"/> 
     <generator class="sequence"> 
      <param name="sequence">PLAYER_SEQ</param> 
     </generator> 
    </id> 
    <set name="privilages" table="PRIVILAGE" 
     inverse="false" lazy="true" fetch="select" cascade="all" > 
     <key> 
      <column name="ID"/> 
     </key> 
     <many-to-many entity-name="model.Privilage"> 
      <column name="PRIVILAGE" not-null="true" /> 
     </many-to-many> 
    </set> 
    <!-- ... --> 
</class> 

+0

Ich sehe 'inverse = false' für beide Entitäten im -Tag. Nur einer von ihnen muss falsch sein und andere sollten wahr sein. –

Antwort

3

Sie sollten Ihre many-to-many-Beziehung Tabelle verweisen PLAYER_PRIV genannt:

<set name="privilages" table="PLAYER_PRIV" 
    inverse="true" lazy="true" fetch="select"> 
    <key> 
     <column name="ID"/> 
    </key> 
    <many-to-many entity-name="model.Privilage"> 
     <column name="PRIV_ID" not-null="true"/> 
    </many-to-many> 
</set> 

und

<set name="players" table="PLAYER_PRIV" 
    inverse="false" lazy="true" fetch="select"> 
    <key> 
     <column name="ID"/> 
    </key> 
    <many-to-many entity-name="model.Player"> 
     <column name="PLAYER_ID" not-null="true"/> 
    </many-to-many> 
</set> 
0

Sie kartieren die falsche Zuordnungstabelle Namen und ihre Spalten.

1), um die Zuordnungstabelle für beide Seiten gleich ist (PLAYER_PRIV):

<set name="privilages" table="PLAYER_PRIV" 
    ... 
</set> 

<set name="players" table="PLAYER_PRIV" 
    ... 
</set> 

2) Spalten in Privilage Zuordnungen:

<key> 
    <column name="PRIV_ID"/> 
</key> 
<many-to-many entity-name="model.Player"> 
    <column name="PLAYER_ID" not-null="true" /> 
</many-to-many> 

In Player Mappings ist es das Gegenteil:

<key> 
    <column name="PLAYER_ID"/> 
</key> 
<many-to-many entity-name="model.Privilage"> 
    <column name="PRIV_ID" not-null="true" /> 
</many-to-many> 

3) Ansonsten müssen Sie wählen eine Seite zu sein inverse. Vom documentation:

Wenn der Verband bidirektional ist, hat eine Seite der Eigentümer und einer Seite zu sein hat die inverse Ende sein (dh es wird ignoriert, wenn die Beziehung Werte in der Zuordnungstabelle zu aktualisieren.).

4) Sie wollen wahrscheinlich nicht cascade=all in many-to-many-Vereinigungen verwenden, denn wenn ein Privileg Entfernen Sie wahrscheinlich alle Spieler zu entfernen, nicht wollen, auf die das Privileg gewährt wird.

+0

Danke für die Antwort wird eine Chance haben, es am 11. Januar zu überprüfen und zu akzeptieren.Frohes Neues Jahr –

+0

Ich bekomme eine Ausnahme: 'Initial SessionFactory Erstellung failed.org.hibernate.MappingException: Fremdschlüssel (FK8CD18EE134E8E09F: PLAYER [PLAYER_ID])) muss die gleiche Anzahl von Spalten haben wie der referenzierte Primärschlüssel (PLAYER [PRIV_ID, PLAYER_ID]) ' –