2015-04-16 9 views
6

In Java, ho accesso al valore dei campi Transient della classe. Tuttavia, non accedo agli stessi campi su JSP. Come posso renderli disponibili a JSP?A causa di Hibernate Mapping è necessario disporre di alcuni campi come @Transient ma JSP non ha accesso ad essi

Sto recuperando i valori utilizzando Hibernate, penso che una soluzione a questo sarebbe l'opzione Transformers.aliasToBean ma c'è qualche altra soluzione?

Esiste comunque un modo per eliminare l'annotazione transitoria ma avere la stessa mappatura in Hibernate? In tal caso, il problema sarà risolto.

@AssociationOverrides({ 
     @AssociationOverride(name = "tta.names", joinColumns = @JoinColumn(name = "id"))}) 
public class Names implements java.io.Serializable { 

    private static final long serialVersionUID = -30956546435023625398L; 

    @EmbeddedId 
    private TableToAssociate tta = new TableToAssociate(); 


    @Transient 
    public String getid() { 
     return tta.getMyIds().getId(); 
    } 

    public void setid(String id) { 
     this.tta.getMyIds().setId(id); 
    } 

In Java, posso accedervi utilizzando seguente codice

 System.out.println(mystudents.getNames().iterator().next().getId()); 

In JSP, non ho accesso ad essi!

<c:forEach var="nm"items="${mystudents.names}"> 
        ${nm.id} 
       </c:forEach> 

Se metto un altro campo di nomi che non è transitorio, JSP mostrano con successo il valore di tale elemento.

+0

e dov'è *** campo transitorio *** nel codice pubblicato? –

+0

@NeerajJain è una joinColumn definita sulla classe. la domanda è aggiornata, anche se non ha importanza in quanto ho getter e setter per transitori. Immagina che non ci sia alcun campo JSP dovrebbe avere accesso ai metodi getter. –

+1

L'intero punto di un campo transitorio è che non è gestito da Hibernate. Il suo valore non è persistente, salvato e non può essere recuperato perché non dovrebbe entrare nel database. Vedi [qui] (http://stackoverflow.com/questions/2154622/why-does-jpa-have-a-transient-annotation) per le specifiche – JamesENL

risposta

3

Provare a rinominare i metodi in modo che corrispondano alle specifiche JavaBean.

Invece di:

@Transient 
public String getid() { 
    return tta.getMyIds().getId(); 
} 

public void setid(String id) { 
    this.tta.getMyIds().setId(id); 
} 

si dovrebbe avere:

@Transient 
public String getId() { 
    return tta.getMyIds().getId(); 
} 

public void setId(String id) { 
    this.tta.getMyIds().setId(id); 
} 
0

Sta succedendo perché la parola chiave transient interrompe la serializzazione del campo. Per passare un oggetto a JSP, deve essere serializzato. Questo campo non sarà lì nel tuo oggetto serializzato e, quindi, non è disponibile per JSP.

Per risolvere il problema, dovresti vedere il commento di James per utilizzare l'annotazione @Transient. Viene fornito da JPA e dovrebbe consentire di NON salvare il valore in DB, ma di serializzarlo in modo che il tuo JSP possa usarlo.

+0

Grazie, so che è a causa dell'annotazione transitoria ma come risolvere il problema, a causa dell'ibernazione ho bisogno di mantenerli transitori. –

+0

Poiché non è possibile farlo direttamente, è necessario creare un nuovo oggetto String con il valore di questo campo in cui si passa l'oggetto a JSP. Qui, si passa anche questo nuovo oggetto stringa e lo si utilizza nel JSP. – Aakash

+0

Ricorda di contrassegnare questo come una risposta se ha risolto il tuo problema. – Aakash

0

quello che stai chiedendo non è possibile .. Come più intelligenti poi mi ha detto prima.

@Transient sta solo dicendo di non serializzare/deserializzare. Hibernate non serializza questo e lo stesso cosa è il bean jsp.

Si possono fare diverse cose:

  1. credo che la cosa migliore è quello di avvolgere campo in getter e setter nel chicco .. In questo modo potrete impostare la proprietà sul fagioli e nel caso di un solo un campo ogni altra soluzione sarà overhead.
public class Bean() { 
private Names name; 
private String id; 
public Bean() { 
    //few action to load name 
    this.id = name.getid(); 
} 
public String getId() { 
    return this.id; 
} 
  1. Creare un'entità diversa per l'interfaccia utente (Bean) e DB (Hibernate).In molti casi strato di interfaccia utente e le entità non sono la stessa e talvolta non dovrebbero essere accoppiati
  2. È possibile utilizzare l'ereditarietà e creare implemenation differente nell'entità hibernate e sul livello di interfaccia utente (Jsp fagioli)

Se mi chiedete Penso che il meglio sia fare ciò che si trova nella sezione 1. Se questo dovesse accadere, dovresti considerare di sganciare il tuo livello utente e l'entità aziendale.

3

Sbarazzarsi di @Transient sulla propria entità. In base all'ID incorporato, hai scelto le annotazioni sul campo. Dovresti essere in grado di avere un getter che Hibernate non cercherà di persistere senza contrassegnarlo esplicitamente come tale. E modificare il getter/setter per utilizzare la sintassi JavaBean corretta. getId anziché getid.