Domanda

Ho alcune domande circa l'interazione con Sospensione:

  1. Posso utilizzare openSession o getCurrentSession (senza jta, filo invece)?
  2. Come faccio a sessione di mix operazioni con lo Swing GUI?È bene avere qualcosa di simile al codice riportato di seguito in un JavaBean classe?

    public void actionPerformed(ActionEvent event) {
        // session code
    }
    
  3. Posso aggiungere metodi a mio entità che contiene la query HQL o è una cattiva pratica?Per esempio:

     // This method is in an entity MyOtherEntity.java class
     public int getDuration(){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        int sum = (Integer) session.createQuery("select sum(e.duration) as duration from MyEntity as e where e.myOtherEntity.id=:id group by e.name").
            .setLong("id", getId());
            .uniqueResult();
        return sum;
     }
    

Come posso fare questo in un modo migliore e in modo elegante?

AGGIORNAMENTO Una prassi ampiamente usata è quello di rendere un servizio/classe dao per raggiungere CRUD funzionamento della nostra classe di entità.Ma perché è questo bene?Perché devo scrivere una classe per ogni mio entità da gestire?Dove è il reale vantaggio?

AGGIORNA 2 Classe di servizio è un pattern DAO?Che cosa significa questo?Arthur Ronald F D Garcia repository esempio è un pattern DAO, è questo quello che viene chiamato un "livello di servizio"?

È stato utile?

Soluzione

Se si desidera contare su di una semplice Sospensione API è possibile utilizzare un livello di Servizio perché

  • È Use case driven
  • Delimitare i limiti delle Transazioni

Così si può creare un AccountService, per esempio, come

public static path.to.HibernateUtil.getSessionFactory;

public class AccountService {

    public void withdraw(Integer accountNumber, BigDecimal amount) throws Exception {
        /**
          * Here you set up Transaction boundaries
          */
        getSessionFactory().getCurrentSession().beginTransaction();

        // Some actions goes here

        getSessionFactory().getCurrentSession().getTransaction().commit();
    }

}

È in genere bisogno di un repository quando svolgono la loro attività all'interno del vostro livello di Servizio.Si può Pensare di repository come un fornitore di dati e di archiviazione. Qui si può vedere come implementare il mio repository.

Se vuoi un mantenibile e leggibile query HQL, Io consiglio di esternare la tua query HQL in un multline e esternalizzato file xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <query name="GIFT_CARDS_WITH_BUYER">
        <![CDATA[
            from 
                GiftCard c
            left join fetch 
                c.buyer
            where
                c.recipientNotificationRequested = 1
       ]]>
    </query>
    <query name="GIFT_CARDS_WITHOUT_NO_RELATIONSHIP">
        <![CDATA[
            from 
                GiftCard
        ]]>
    </query>
</hibernate-mapping>

Così all'interno del vostro Swing GUI Evento, è possibile chiamare il vostro livello di servizio come

public void actionPerformed(ActionEvent event) {
    // Some related Swing GUI actions goes here (retrieve User input, validate data and so on...)

    accountService.withdraw(accountNumber, new BigDecimal(amount));
}

E non è una buona idea usare la persistenza azioni all'interno del vostro Ente.Se avete bisogno di eseguire la persistenza di problemi correlati all'interno del vostro Ente, Credo che sia meglio che si passa il vostro repository come parametro di Entità

public class Account {

   public void doSomething(AccountRepository repository) {
       // code goes here
   }

}

Forse si vuole vedere questo Thread

Io consiglio di dare un'occhiata a Java Persistence con Sospensione libro, capitolo 9, paragrafo Lavorare con gli oggetti). ATT:leggere attentamente

AGGIORNAMENTO

Perché, è bene avere un livello di servizio ?

Prima di tutto

  • È Use case driven (Si disegna ciò che la vostra applicazione dovrebbe fare)

In secondo luogo di tutti

  • Si delimitare i limiti delle Transazioni

Supponiamo che qui va il tuo livello di Servizio

public class MyService {

    public void doSomething() {
        getSessionFactory().beginTransaction();

        // A POJO doing some operation

        // Other POJO doing other operation

        // Another POJO doing another operation

        getSessionFactory().getTransaction().commit();
    }

}

L'avviso è sufficiente definire una Transazione limite invece che la definizione di ciascuno all'interno di ogni POJO.E in più, cosa succede se il vostro business regola all'interno del vostro Swing GUI devono essere utilizzati all'interno di altri componenti.Utilizzare una combinazione di tasti Ctrl-c + Ctrl-v ???

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