2017-08-06 1 views
0

Es gibt zwei Tabellen: Flugzeug und MotorAngeben mehrere Eins-zu-Eins-Beziehungen zwischen Tabellen in Hibernate

Der Motortisch setzt sich wie folgt [Engine_ID, Engine_Name,Airplane_Owner_ID].
die Flugzeug-Tabelle wird wie folgt hergestellt [Airplane_ID, Left_Engine, Right_Engine]

Left_Engine und Right_Engine sind Fremdschlüssel aus dem Motortisch Überdies ist Airplane_Owner_ID der Fremdschlüssel aus der Flugzeug-Tabelle. Daher gibt es drei Eins-zu-Eins-Beziehungen, die zwischen den Tabellen Aeroplane und Engine definiert sind.

Ich weiß, wie man einzelne Eins-zu-Eins-Beziehungen zwischen zwei Tabellen spezifiziert, aber wie kann ich mehrere Beziehungen zwischen zwei Tabellen angeben? Ist es der gleiche Prozess?

Wie können diese Beziehungen in Hibernate angegeben werden?

Antwort

0

Als @APC sagte Zyklische Abhängigkeiten zwischen Motor und Flugzeug ist ein schlechtes Design. Aber mit der unten beschriebenen Lösung könnte Engine.Airplane_Owner_ID nur als logischer Backlink implementiert werden, der in der Datenbanktabelle nicht existiert.

Airplane.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-mapping"> 
<hibernate-mapping> 
    <class name="Airplane" table="AIRPLANE"> 
     <id name="id" type="int" column="AIRPLANE_ID"> 
      <generator class="native"/> 
     </id> 
     <property name="name" column="AIRPLANE_NAME" type="string" length="250"/> 
     <many-to-one name="rightEngine" class="Engine" cascade="save-update" unique="true"/> 
     <many-to-one name="leftEngine" class="Engine" cascade="save-update" unique="true"/> 
    </class> 
</hibernate-mapping> 

Engine.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-mapping"> 
<hibernate-mapping> 
    <class name="Engine" table="ENGINE"> 
     <id name="id" type="int" column="ENGINE_ID"> 
      <generator class="native"/> 
     </id> 
     <property name="name" column="ENGINE_NAME" type="string" length="250"/> 
     <property name="position" column="ENGINE_POSITION" type="java.lang.Byte" /> 

     <one-to-one name="ownerAirplane" property-ref="rightEngine" /> 
    </class> 
</hibernate-mapping> 

Flugzeug.java

public class Airplane { 
    private int id; 
    private String name; 

    private Engine rightEngine; 
    private Engine leftEngine; 

    public Airplane(String name) { 
     this.name = name; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Engine getRightEngine() { 
     return rightEngine; 
    } 

    public void setRightEngine(Engine rightEngine) { 
     this.rightEngine = rightEngine; 
    } 

    public Engine getLeftEngine() { 
     return leftEngine; 
    } 

    public void setLeftEngine(Engine leftEngine) { 
     this.leftEngine = leftEngine; 
    } 

    @Override 
    public String toString() { 
     return "Airplane{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", rightEngline=" + (rightEngine == null ? null : rightEngine.getName()) + 
       ", leftEngine=" + (leftEngine == null ? null : leftEngine.getName()) + 
       '}'; 
    } 
} 

Engine.java

public class Engine { 

    private int id; 
    private String name; 
    private byte position;//0=left, 1=right 
    private Airplane ownerAirplane; 

    /** 
    * @param name 
    * @param position 0=left, 1=right 
    */ 
    public Engine(String name, byte position) { 
     this.name = name; 
     this.position = position; 
    } 

    public Airplane getOwnerAirplane() { 
     return ownerAirplane; 
    } 

    public void setOwnerAirplane(Airplane ownerAirplane) { 
     this.ownerAirplane = ownerAirplane; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * @return 0=left, 1=right 
    */ 
    public byte getPosition() { 
     return position; 
    } 

    /** 
    * @param position 0=left, 1=right 
    */ 
    public void setPosition(byte position) { 
     this.position = position; 
    } 


    @Override 
    public String toString() { 
     return "Engine{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", position=" + position + 
       ", ownerAirplane=" + (ownerAirplane == null ? null : ownerAirplane.getName()) + 
       '}'; 
    } 
} 

Main.java

public static void main(final String[] args) throws Exception { 

     Session session = ourSessionFactory.openSession(); 
     Transaction transaction = null; 
     try { 
      transaction = session.beginTransaction(); 
      Engine engineRight1 = new Engine("engineRight1", (byte) 1); 
      Engine engineLeft1 = new Engine("engineLeft1", (byte) 0); 
      Airplane airplane1 = new Airplane("Airplane1"); 

      Engine engineRight2 = new Engine("engineRight2", (byte) 1); 
      Engine engineLeft2 = new Engine("engineLeft2", (byte) 0); 
      Airplane airplane2 = new Airplane("Airplane2"); 

      Engine engineRight3 = new Engine("engineRight3", (byte) 1); 
      Engine engineLeft3 = new Engine("engineLeft3", (byte) 0); 
      Airplane airplane3 = new Airplane("Airplane3"); 

      engineLeft1.setOwnerAirplane(airplane1); 
      engineRight1.setOwnerAirplane(airplane1); 
      airplane1.setLeftEngine(engineLeft1); 
      airplane1.setRightEngine(engineRight1); 

      engineRight2.setOwnerAirplane(airplane2); 
      airplane2.setRightEngine(engineRight2); 
//   airplane2.setLeftEngine(engineLeft1); 

      engineRight3.setOwnerAirplane(airplane3); 
      airplane3.setLeftEngine(engineLeft3); 

      session.save(airplane1); 
      session.save(airplane2); 
      session.save(airplane3); 

      session.save(engineLeft1); 
      session.save(engineLeft2); 
      session.save(engineLeft3); 
      session.save(engineRight1); 
      session.save(engineRight2); 
      session.save(engineRight3); 

      transaction.commit(); 
     } catch (HibernateException e) { 
      transaction.rollback(); 
      e.printStackTrace(); 
     } 
2

„Left_Engine und Right_Engine Fremdschlüssel aus dem Motor Tabelle sind,
zudem Airplane_Owner_ID ist der Fremdschlüssel aus der Flugzeug-Tabelle.“

Ihr Problem ist Airplane von Engine verwiesen wird und Engine wird durch Airplane verwiesen. In Ihrem Datenmodell ist jede Tabelle das Kind des anderen. Zyklische Abhängigkeiten sind in der Datenbank genauso schlecht wie in anderen Teilen des Stapels.

Die beste Lösung ist das Datenmodell zu reparieren.

  • Tropfen Left_Engine und Right_Engine von Airplane
  • Engine_Position zu Engine
  • fügen Sie eine eindeutige Einschränkung hinzufügen auf Engine (Airplane_Owner_ID, Engine_Position)
  • auch eine Check-Einschränkung auf Engine_Position für LINKS, RECHTS, oder verwenden Sie einen Fremdschlüssel auf einem hinzufügen Referenzdatentabelle

Dieses Modell hat zwei Tugenden:

  1. Klare Eigentumsverhältnisse - Flugzeuge besitzen Motoren, Triebwerke besitzen keine Flugzeuge.
  2. Es unterstützt leicht Ebene mit unterschiedlichen Konfigurationen von Motoren (ein, drei, vier ...)
+2

Stellen Sie sicher, sicher landen vor Left_Engine und Right_Engine vom Flugzeug fallen. –

+0

Ich bin nicht verantwortlich für dieses Problem in Datenbanktabellen. Außerdem habe ich keine Erlaubnis, es zu korrigieren. Diese Datenbank wurde mir gegeben, und ich muss dafür eine Datenzugriffsschicht entwickeln. – Razavi

+1

@razavi - leider scheint die Welt voller Leute zu sein, die gegen shonky Datenmodelle arbeiten, die nicht die Macht haben, sie zu ändern. Der Punkt ist, das Datenmodell ist kaputt und jeder Code, den Sie dafür schreiben, wird auch gebrochen. Mein Rat wäre, die Angelegenheit jetzt anzusprechen. Dann sind Sie zumindest betroffen, wenn sich andere darüber beschweren, dass Ihr Datenzugriffscode nicht richtig funktioniert. – APC

Verwandte Themen