Domanda

Ho un'applicazione a molla hibernate, che non riesce a mappare un oggetto correttamente: in fondo ho 2 oggetti di dominio, un Post e User. La semantica è che ogni messaggio ha 1 corrispondente utente.

L'oggetto di dominio Post sembra meno come segue:

class Post {

  private int pId;
  private String attribute;
  ...
  private User user;

  //getters and setters here

}

Come si può vedere, Post contiene un riferimento a User. Quando carico un oggetto Post, voglio oggetto User corrispondente da caricare (pigramente - solo quando il suo necessario).

Il mio mappatura appare come segue:

<class name="com...Post" table="post">
    <id name="pId" column="PostId" />
    <property name="attribute" column="Attribute" type="java.lang.String" />

    <one-to-one name="User" fetch="join"
        class="com...User"></one-to-one>
</class>

E, naturalmente, ho una mappatura di base per User set up.

Per quanto riguarda il mio schema della tabella è interessato, ho una tabella chiamata post con una UserId straniero che collega alla tabella user.

Ho pensato che questa configurazione dovrebbe funzionare, ma quando carico una pagina che costringe il lazy loading dell'oggetto User, ho notato la seguente query in Hibernate generato:

Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...

Ovviamente questo è sbagliato: dovrebbe unirà UserId da post con UserId da user, ma invece la sua PostId unirsi in modo non corretto da post (la sua chiave primaria) con UserId da user

.

Tutte le idee? Grazie!

Aggiorna : Grazie ad un paio di post più sotto ora mi rendo conto che avrei dovuto usando una mappatura molti-a-uno invece di un uno-a-. Ho cambiato la mappatura sotto post al seguente:

<many-to-one name="User" class="com...User" column="uId"/>

Ma ora ho un errore di run-time a dirmi che non v'è alcun attributo chiamato uId. Questo ha senso dal momento che non ho una colonna uId nel mio oggetto di dominio post (ho semplicemente ho un riferimento a un oggetto user). Ora sono davvero confuso su come posso ottenere Hibernate per rendersi conto che ha bisogno di mappare il chiave esterna dalla tabella posta alla tabella utente. Dovrebbe esplicitamente aggiungere un attributo uId al mio oggetto di dominio post di essere un segnaposto per la chiave esterna?

Spero che sto facendo senso ...

È stato utile?

Soluzione

Dal momento che un utente ha molti messaggi, la vostra associazione è in realtà un "molti-a-uno", non è un "one-to-one". Dovrebbe funzionare se si esegue il mapping di conseguenza.

Modifica : Sì, è possibile mappare la proprietà Post.user sul palo con un "molti-a-uno", o l'insieme User.posts in uso con un "one-to- molti", o entrambi. Avete specificato il nome della colonna di chiave esterna?

Edit2 : In Hibernate dire, una "colonna" del database è associata a una "proprietà" in Java-Class. Cioè, l'attributo colonna contiene il nome della colonna di chiave esterna nel database, non il nome di qualsiasi proprietà nella classe Java. Se ho letto la tua domanda giusta, si dovrebbe usare "UserID", non "uid".

Oh, e prendere = "join" non può essere pigri, in quanto mandati che l'utente viene recuperata nella stessa query come il post.

Altri suggerimenti

Questo è il comportamento di un mapping uno-a-uno. Di solito condividono una chiave primaria. Hibernate assume che la chiave primaria della post è teh stesso come la chiave primaria di utente. Questa pagina riassume questo comportamento.

Ho il sospetto che un utente può effettivamente avere più di un post però. Che rende la mappatura uno-a-molti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top