Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

di il
15 risposte

Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

Ciao a tutti.
Ho un problema con la creazione della classe "NomeTabellaDaoImpl"
Per una tabella ho fatto l'interfaccia "NomeTabellaDao"
ad esempio devo fare l'interfaccia per la tabellla T_Competenza che qui sotto visualizzo

package com.sifhb.webapp.dao;

import java.util.List;

import com.sifhb.webapp.entities.T_Competenza;

public interface T_CompetenzaDao {
	
	T_Competenza SelByIdCompetenza(int idCompetenza);
	
	List<T_Competenza> SelTutti();
	
	void Salva(T_Competenza competenza);
	
	void Elimina(T_Competenza competenza);
	
	void Aggiorna(T_Competenza competenza);	
}

Quando vado a fare creazione della classe T_CompetenzaDaoImpl e faccio Add unimplemented methods per inserire tutti i metodi definiti nell'interfaccia, mi vengono inseriti solo alcuni.

perchè e come faccio a inserire i rimanenti ?

nello specifico visualizzo i metodi importati dall'interfaccia

package com.sifhb.webapp.dao;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import org.springframework.stereotype.Repository;
import com.sifhb.webapp.entities.T_Competenza;

@Repository
public class T_CompetenzaDaoImpl extends AbstractDao<T_Competenza, Integer> implements T_CompetenzaDao  {

	@Override
	public T_Competenza SelByIdCompetenza(int idCompetenza) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void Salva(T_Competenza competenza) {
		// TODO Auto-generated method stub
		
	}
}
nello specifico nella classe T_CompetenzaDaoImpl mancano i metodi

- List<T_Competenza> SelTutti();
- void Elimina(T_Competenza competenza);
- void Aggiorna(T_Competenza competenza);

che sono invece presenti nell'interfaccia e che non sono segnalati con errore.


come posso risolvere il problema ?
Grazie

Moreno



una notizia tecnica.
Come posso impostare "Risolto" un problema che ho inserito e che, grazie al vostro aiuto è stato risolto ?

Grazie e buona giornata

Moreno
Allegati:
operatività per implementazione metodi dalla interfaccia Dao
operatività per implementazione metodi dalla interfaccia Dao

15 Risposte

  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    E ... cosa c'è in AbstractDao ?
    Perché se ha già delle implementazioni di alcuni di quei metodi ... ovviamente non sono più astratti e cioè segnati "unimplemented".
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Ciao AndBin

    ecco la classe AbstractDao
    
    
    package com.sifhb.webapp.dao;
    
    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.util.List;
    
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaDelete;
    import javax.persistence.criteria.CriteriaQuery;
    
    import com.sifhb.webapp.dao.GenericRepository;
    
    public abstract class AbstractDao<I extends Serializable, Id extends Serializable>
    implements GenericRepository<I, Id>  {
    			
    	@PersistenceContext
    	protected EntityManager entityManager;
    	
    	protected final Class<I> entityClass;
    	
    	@SuppressWarnings("unchecked")
    	public AbstractDao()
    	{
    		this.entityClass = (Class<I>) ((ParameterizedType) 
    				this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    	}
    	
    	@Override
    	public List<I> SelTutti()
    	{
    		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
            CriteriaQuery<I> query = builder.createQuery(this.entityClass);
    
            return this.entityManager.createQuery(
            		query.select(query.from(this.entityClass))).getResultList();
    	}
    	
    	@Override
    	public I SelById(Id id)
    	{
    		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
    		CriteriaQuery<I> query = builder.createQuery(this.entityClass);
    			
    		return this.entityManager.createQuery(
    					query.where(
    							builder.equal(
    									query.from(this.entityClass).
    									get("id"), id))).
    					getSingleResult();
    			
    	}
    	
    	@Override
    	public void Inserisci(I entity)
    	{
    		this.entityManager.persist(entity);
    		flushAndClear();
    	}
    	
    	@Override
    	public void Aggiorna(I entity)
    	{
    		this.entityManager.merge(entity); 
    		flushAndClear();
    	}
    	
    	@Override
    	public void Elimina(I entity)
    	{
    		
    		this.entityManager.remove(this.entityManager.contains(entity) ? entity : this.entityManager.merge(entity));
    		flushAndClear();
    		
    	}
    	
    	@Override
    	public void EliminaById(Id id)
    	{
    		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
    		CriteriaDelete<I> query = builder.createCriteriaDelete(this.entityClass);
    		
    		this.entityManager.createQuery(
    				query.where(
    						builder.equal(
    								query.from(this.entityClass)
    								.get("id"), id)
            )).executeUpdate();
    		
    		flushAndClear();
    	}
    	
    	private void flushAndClear() 
    	{
    	    entityManager.flush();
    	    entityManager.clear();
    	}
    	
    	
    
    }
    
    
    
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    misonsan ha scritto:


    ecco la classe AbstractDao
    Ma lo vedi bene anche tu che ha proprio i metodi che tu dici che mancano!

    In AbstractDao c'è:

    public void Elimina(I entity)

    (I è una type variable). Ma quando nella sotto-classe metti

    extends AbstractDao<T_Competenza, Integer>

    di fatto vai a "fissare" la parametrizzazione e quindi il Elimina a tutti gli effetti ha la signature

    public void Elimina(T_Competenza entity)

    che quindi implementa già il (public, per default) void Elimina(T_Competenza competenza) della tua interfaccia T_CompetenzaDao e pertanto non è più "unimplemented".
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Ciao AndBin

    La tua osservazione è corretta, ma la cosa che non mi spiego è perchè, dato che nella Abstract non è previsto il metodo "Salva", facendo l'aggiunta dei metodi presenti nell'interfaccia NON inserisce il metodo salva.
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    misonsan ha scritto:


    ma la cosa che non mi spiego è perchè, dato che nella Abstract non è previsto il metodo "Salva", facendo l'aggiunta dei metodi presenti nell'interfaccia NON inserisce il metodo salva.
    Te lo ha generato il salva, guarda il primo post, "TODO Auto-generated method stub" nel Salva.


    P.S. tra l'altro: roba parecchio "bruttina"

    this.entityClass = (Class<I>) ((ParameterizedType)
    this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];


    Anche perché la soluzione "bella" (e "pulita") c'è perfettamente.
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Ciao AndBin

    mi scuso anticipatamente, ma non ho capito la tua ultima risposta e preferisco fare la figura del cioccolatino, ma capire bene il meccanismo.

    mi hai scritto nella tua ultima risposta
    Te lo ha generato il salva, guarda il primo post, "TODO Auto-generated method stub" nel Salva.
    nella classe DaoImpl vedo che sono visibili tutti i metodi dell'interfaccia Dao + i metodi della classe Abstract.
    In questa classe astratta NON c'è il metodo salva.

    Domanda: perchè nella DaoImpl vengono implementati tutti i metodi tranne ceh Salva ?

    e come fa ad essere stato generato il metodo salva come dici nella tua risposta ?
    P.S. tra l'altro: roba parecchio "bruttina"

    this.entityClass = (Class<I>) ((ParameterizedType)
    this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

    Anche perché la soluzione "bella" (e "pulita") c'è perfettamente.
    la classe abstract è scritta male ?
    dove la trovo una scritta bene ?
    cosa c'è di scritto male da ritenerla da non usare ?

    Mi scuso anticipatamente, ma è solo perchè vorrei capire i problemi per poter condividere le soluzioni.
    So che hai tanta pazienza e mi scuserai se ne approfitto, ma ti disturbo perchè so che sai dare spiegazioni tecniche molto ben spiegate.

    Grazie

    Moreno
    Allegati:
    19656_b2f10827f7df15f434539119684bb241.jpg
    19656_b2f10827f7df15f434539119684bb241.jpg
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    misonsan ha scritto:


    mi scuso anticipatamente, ma non ho capito la tua ultima risposta e preferisco fare la figura del cioccolatino, ma capire bene il meccanismo.

    mi hai scritto nella tua ultima risposta
    Te lo ha generato il salva, guarda il primo post, "TODO Auto-generated method stub" nel Salva.
    nella classe DaoImpl vedo che sono visibili tutti i metodi dell'interfaccia Dao + i metodi della classe Abstract.
    In questa classe astratta NON c'è il metodo salva.

    Domanda: perchè nella DaoImpl vengono implementati tutti i metodi tranne ceh Salva ?

    e come fa ad essere stato generato il metodo salva come dici nella tua risposta ?
    (Ri)guarda il primo (tuo) post della discussione, il secondo pezzo di codice dove hai messo la T_CompetenzaDaoImpl. Il Salva c'è! Contiene il commento "TODO Auto-generated method stub" quindi te lo ha generato l'IDE ... no?

    misonsan ha scritto:


    la classe abstract è scritta male ?
    dove la trovo una scritta bene ?
    cosa c'è di scritto male da ritenerla da non usare ?
    E' "brutto" quel giro per andare a prendere dinamicamente il Class della parametrizzazione.
    La soluzione "giusta" e pulita c'è perfettamente.

    Nella classe astratta AbstractDao si mette il costruttore che riceve il Class<I>
    protected final Class<I> entityClass;
    
    public AbstractDao(Class<I> entityClass) {
        this.entityClass = entityClass;
    }
    e nota: NON serve alcun @SuppressWarnings("unchecked") !

    Poi in una sottoclasse, es. la tua T_CompetenzaDaoImpl si passa il "type-token" (un oggetto Class usato a runtime) effettivo al costruttore della super-classe (cioè AbstractDao).
    public class T_CompetenzaDaoImpl extends AbstractDao<T_Competenza, Integer> implements T_CompetenzaDao  {
        public T_CompetenzaDaoImpl() {
            super(T_Competenza.class);     // <--------- QUESTO!
        }
    La sotto-classe in sostanza: "fissa" la parametrizzazione (con extends AbstractDao<T_Competenza, Integer> ) E "fissa" anche il type-token che poi sarà contenuto nell'oggetto nel campo entityClass di AbstractDao.

    Questa è soluzione.
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Ho ricontrollato l'interfaccia T_CompetenzaDao e la classe T_CompetenzaDaoImpl.

    Non so come sia uscita lo screenshot che ti ho inviato con la prima richiesta di assistenza, ma la situazione reale è questa:

    Interfacciao T_CompetenzaDao
    
    package com.sifhb.webapp.dao;
    
    import java.util.List;
    
    import com.sifhb.webapp.entities.T_Competenza;
    
    public interface T_CompetenzaDao {
    	
    	T_Competenza SelByIdCompetenza(int idCompetenza);
    	
    	List<T_Competenza> SelTutti();
    	
    	void Salva(T_Competenza competenza);
    	
    	void Elimina(T_Competenza competenza);
    	
    	void Aggiorna(T_Competenza competenza);	
    
    
    }
    
    Classe T_CompetenzaImpl
    
    package com.sifhb.webapp.dao;
    
    import java.util.List;
    
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Root;
    
    import org.springframework.stereotype.Repository;
    import com.sifhb.webapp.entities.T_Competenza;
    
    @Repository
    public class T_CompetenzaDaoImpl extends AbstractDao<T_Competenza, Integer> implements T_CompetenzaDao  {
    
    	@Override
    	public T_Competenza SelByIdCompetenza(int idCompetenza) {
    		
    		T_Competenza retVal;
    		
    		CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    		CriteriaQuery<T_Competenza> queryDefinition = cb.createQuery(T_Competenza.class);
    		
    		Root<T_Competenza> recordset = queryDefinition.from(T_Competenza.class);
    		
    		queryDefinition.select(recordset).
    						where(cb.equal(recordset.get("idCompetenzaProd"), idCompetenza));
    		
    		retVal = entityManager.createQuery(queryDefinition).getSingleResult();
    		
    		entityManager.clear();
    		
    		return retVal;
    	}
    	
    	
    	
    	@Override
    	public List<T_Competenza> SelTutti(){
    		
    		return super.SelTutti();
    	}
    
    	@Override
    	public void Salva(T_Competenza competenza) {
    
    		super.Salva(competenza);    // in attesa di risolvere errore
    		
    	}
    
    	@Override
    	public void Elimina(T_Competenza competenza) {
    		
    		super.Elimina(competenza);
    	}
    	
    	@Override
    	public void Aggiorna(T_Competenza competenza)
    	{
    		super.Aggiorna(competenza);
    	}
    		
    }
    
    
    Facendo implementa i metodi in creazione della classe T_CompetenzaImpl NON usciva il metodo Salva (vedoi screenshot allegato e quindi ho tentato di scriverlo a mano, ma quando ho fatto super.salva non mi ha presentato i metodi dell'interfaccia e da qui la mia domanda orginaria.

    mi scuso ancora per aver erroneamente fornito una situazione non corretta negli screnshot iniziali, ma la situazione è questa.

    Creando la classe T_CompetenzaImpl NON vede il metodo "Salva" dell'interfaqccia.

    Grazie

    Moreno
    Allegati:
    19656_1a741ca7067bc27f89c5e42f1f620223.jpg
    19656_1a741ca7067bc27f89c5e42f1f620223.jpg

    19656_6ab2709331c3f3c8ab17e1712a62e9c3.jpg
    19656_6ab2709331c3f3c8ab17e1712a62e9c3.jpg
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Mi posti qui la GenericRepository ? (che non si vede)
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Ecco AndBin la GenericRepository
    
    package com.sifhb.webapp.dao;
    
    import java.io.Serializable;
    import java.util.List;
    
    import javax.validation.constraints.NotNull;
    
    public interface GenericRepository<I extends Serializable, E extends Serializable> {
    			
    	@NotNull
    	List<I> SelTutti();
    	
    	void Inserisci(@NotNull I entity);
    	
    	void Aggiorna(@NotNull I entity);
    	
    	void Elimina(@NotNull I entity);
    	
    	void EliminaById(@NotNull E Id);
    	
    	I SelById(@NotNull E Id);	
    	
    	
    
    }
    
    mi ricordi l'uso di questa interfaccia ?

    graziee

    Moreno
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Ho replicato il tuo codice sul mio Eclipse (per semplicità ho tolto tutte le annotation e la roba di JPA, giusto per avere solo i metodi).
    Allora: se lascio la classe T_CompetenzaDaoImpl "vuota" e poi clicco su "Add unimplemented methods", Eclipse mi inserisce lo scheletro dei metodi SelByIdCompetenza e Salva . Gli altri metodi sono già implementati e se si vuole, si possono ridefinire.

    Quindi continuo a non capire bene il tuo dubbio.
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Quindi nella classe T_CompetenzaDaoImpl è corretto che vengano ribaltati i metodi SelByIdCompetenza e salva perchè non sono definiti nella abstract.
    gli altri (cancella, aggiorna e deltutti funzionano già perche fanno parte della abstract.
    se li voglio posso scriverli a mano con la notazione override come in quelli importati.
    è corretto ?

    ho rifatto anchio la creazione dei metodi dall'interfaccia T_CompetenzaDao.
    esattamente come a te vengono creati gli scheletri dei due metodi SelByIdCompetenza e Salva.

    se vai a correggere il metodo Salva nella classe implementata vedrai che il metodo salva non è visibile tra quelli a elenco.
    nello screenshot allegato vedi bene la situazione.
    Quindi come posso personalizzare il metodo salva nella classe implementata ?


    altra cosa che vedevo in un altro punto del programma.

    nella classe controller ho il metodo initialiseBinder nella quale sono definiti i campi per i quali attivare il Databinding.
    Quando viene richiamato questo metodo ?

    
    	@InitBinder
    	public void initialiseBinder(WebDataBinder binder)
    	{
    		binder.setAllowedFields("idProdotto", "descrProdotto", "dispon", "scomin", "prezzo", "idStatoprodotto", "tcategoria.idCategoria", "ttipologia.idTipologia",
    				"tcompetenza", "keyUserOp", "dateOp");
    
    
    		
    		binder.setDisallowedFields("prezzo");
    
    		
    		NumberStyleFormatter numberFormatter = new NumberStyleFormatter();
    		
    		numberFormatter.setPattern("###.##");
    		binder.addCustomFormatter(numberFormatter, "dispon");
    		
    		
    		numberFormatter.setPattern("##");
    		binder.addCustomFormatter(numberFormatter, "scomin");
    
    	}
    
    Grazie

    Moreno
    Allegati:
    19656_7f8e8a06fa0bfff938566cd9af7bf020.jpg
    19656_7f8e8a06fa0bfff938566cd9af7bf020.jpg
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    misonsan ha scritto:


    Quindi nella classe T_CompetenzaDaoImpl è corretto che vengano ribaltati i metodi SelByIdCompetenza e salva perchè non sono definiti nella abstract.
    gli altri (cancella, aggiorna e deltutti funzionano già perche fanno parte della abstract.
    se li voglio posso scriverli a mano con la notazione override come in quelli importati.
    è corretto ?
    Sì. SelByIdCompetenza e Salva li devi implementare in T_CompetenzaDaoImpl.

    misonsan ha scritto:


    se vai a correggere il metodo Salva nella classe implementata vedrai che il metodo salva non è visibile tra quelli a elenco.
    Perché non c'è "di sopra". Infatti è da IMPLEMENTARE nuovo in T_CompetenzaDaoImpl. Non c'è una implementazione "super" (in un super-tipo). L'unica dichiarazione è quella astratta in T_CompetenzaDao (che NON puoi chiamare da lì con "super", non ha senso).
  • Re: Classe DaoImpl - Non vedo tutti i metodi della Interfaccia

    Grazie per la spigazione.

    Volevo chiederti se potevi darmi una risposta per il secondo quesito che ti avevo posto nella mia precedente risposta.

    lo ripeto

    nella classe controller ho il metodo initialiseBinder nella quale sono definiti i campi per i quali attivare il Databinding.
    Quando viene richiamato questo metodo ?
    
    @InitBinder
    	public void initialiseBinder(WebDataBinder binder)
    	{
    		binder.setAllowedFields("idProdotto", "descrProdotto", "dispon", "scomin", "prezzo", "idStatoprodotto", "tcategoria.idCategoria", "ttipologia.idTipologia",
    				"tcompetenza", "keyUserOp", "dateOp");
    
    
    		
    		binder.setDisallowedFields("prezzo");
    
    		
    		NumberStyleFormatter numberFormatter = new NumberStyleFormatter();
    		
    		numberFormatter.setPattern("###.##");
    		binder.addCustomFormatter(numberFormatter, "dispon");
    		
    		
    		numberFormatter.setPattern("##");
    		binder.addCustomFormatter(numberFormatter, "scomin");
    
    	}
    
    mi scuso se anzichè aprire un nuovo quesito approfitto di questo canale per una domanda secondaria.
    Grazie

    Moreno
Devi accedere o registrarti per scrivere nel forum
15 risposte