Frage

Angenommen, die folgenden Zuordnungen werden vorgesehen:

<class name="A" table="a_table">
  <id name="id"/>
  <many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/>
</class>

<class name="B" table="b_table">
  <id name="id"/>
</class>

Java -Klasse:

public class A {
   private long id;
   private B entityB;
   // getters and setters skipped
}

Ist es möglich, die Hibernate -Mapping so zu ändern, dass das so ist? Der ausländische Schlüssel wird immer noch durch Hibernate beim Start durchgesetzt und erstellt, aber Klasse A würde wie folgender aussehen:

public class A {
   private long id;
   private long idOfB;
   // getters and setters skipped
}

Ich verstehe das, wenn ich konvertiere <many-to-one... in ein <property... Dies würde funktionieren, aber der ausländische Schlüssel würde nicht von der Datenbank durchgesetzt werden.

Ich muss dies tun, weil Objekt Objekt B könnte separat initialisiert (oder nicht), was manchmal verursachtorg.hibernate.LazyInitializationException: could not initialize proxy - no Session Ausnahmen auftreten, wenn a.getB() wird genannt. Ich würde es lieber als als haben long idOfB und laden Sie das ganze Objekt, wann immer erforderlich ist; Dies würde auch das Laden des Objekts machen A schneller.

Ich glaube, meine Frage ist sehr ähnlich zu Dieses hier, Dennoch ist die angebotene Lösung (zur Verwendung von faulen Laden) in meinem Fall nicht angemessen, auch wenn ich anrufe a.getB().getId(), Ich würde bekommen LazyInitializationException Während ich anrufe a.getIdOfB() Ich würde nicht.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Wie gesagt

Ich verstehe das, wenn ich konvertiere Der ausländische Schlüssel würde jedoch nicht durchgesetzt werden in der Datenbank.

Mein Rat ist also: verwende beide

public class EntityA {

    private Integer idOfB;

    private EntityB entityB;

    // getter's and setter's

}

Und

<class name="A" table="a_table">
    <id name="id"/>
    <property name="idOfB" column="fk_B" not-null="false" unique="true"/>
    <many-to-one name="entityB" update="false" insert="false" column="fk_B"/>
</class>

Beachten Sie, wenn zwei Eigenschaften dieselbe Spalte teilen, Sie müssen Einstellungen darüber in nur einer Immobilie einstellen. Andernfalls beschweren sich Hibernate einige Fehler. Es wird erklärt, warum ich in der EntityB -Eigenschaft update = "false" und einfügen = "False" definiere.

Grüße,

Andere Tipps

Sie können immer die fremde Schlüssel DDL in Ihrer Hibernate HBm.xml -Datei manuell erstellen:

<hibernate-mapping>
    ...
    <database-object>
        <create>[CREATE FK]</create>
        <drop>[DROP FK]</drop>
    </database-object> 
</hibernate-mapping>

Sie können dies auch gründen, wenn verschiedene Dialekte unterstützt werden müssen.

Kasse 5.7. Hilfsdatenbankobjekte

Ein weiterer Ansatz, den Sie wählen könnten, besteht darin, die FK eher mit Ihrer B -Mapping als mit der A -Mapping zu definieren. Ich habe den JPA -Code hinzugefügt, Sie müssten diese in Ihre Hibernate -Mapping -Datei übersetzen, wenn Sie keine Anmerkungen verwenden.

@Entity
public class B
{
    private long id;
    private List<A> aList;

    @Id
    @Column( name = "ID" )
    public long getId()
    {
        return id;
    }

    @OneToMany
    @JoinColumn( name = "B_ID" )
    public List<A> getAList()
    {
        return aList;
    }
    public void setId( long id )
    {
        this.id = id;
    }
    public void setAList( List<A> aList )
    {
        this.aList = aList;
    }        
}

A.java würde nicht so aussehen:

@Entity
public class A
{
    private long id;
    private long idOfB;

    @Id
    @Column( name = "ID" )
    public long getId()
    {
        return id;
    }
    @Column( name = "B_ID" )
    public long getIdOfB()
    {
        return idOfB;
    }
    public void setId( long id )
    {
        this.id = id;
    }
    public void setIdOfB( long idOfB )
    {
        this.idOfB = idOfB;
    }   
}

Ich empfehle Ihnen, Objekte Objekten zu verknüpfen, um die vollen Vorteile von Hibernate zu erzielen. Ich denke, das Problem ist die Ausnahme, die Sie bekommen. Dies liegt daran, dass die Hibernate -Sitzung bereits geschlossen ist, wenn Sie versuchen, das faule Objekt zu erhalten. In diesem Blog gibt es mehrere Beiträge, die Antworten auf dieses Problem zeigen, beispielsweise dieses:Link Text.

Falls Sie Spring verwenden, können Sie OpenentityManagerInViewFilter verwenden, damit die Sitzung geöffnet bleibt, bis die Ansicht Renderes ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top