Frage

Ich habe einige Fragen über die Interaktion mit Hibernate:

  1. verwende ich Open oder getCurrentSession (ohne jta, Faden statt)?
  2. Wie mische ich Sitzung Operationen mit dem Swing-GUI? Ist eine gute so etwas wie die folgenden Code in einer JavaBean-Klasse?

    public void actionPerformed(ActionEvent event) {
        // session code
    }
    
  3. Can I add Methoden auf meine Entitäten, die HQL-Abfragen enthält, oder ist dies eine schlechte Praxis? Zum Beispiel:

     // 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;
     }
    

Wie kann ich tun dies in einer besseren und elegante Art und Weise?

UPDATE Eine weit verbreitete Praxis ist eine Dienstleistung / dao Klasse machen CRUD Betrieb unserer Einheiten Klasse zu erreichen. Aber warum ist das gut? Warum muss ich eine Klasse schreiben für jede meine Entitäten es zu verwalten? Wo ist der wirkliche Vorteil?

UPDATE 2 Service-Klasse ist ein DAO-Muster? Was bedeutet das? Arthur Ronald FD Garcia Repository Beispiel ist ein DAO-Muster, das ist, was eine "Service-Layer" genannt wird?

War es hilfreich?

Lösung

Wenn Sie auf setzen auf Ebene Hibernate API Sie eine Service-Schicht verwenden können, weil

  • Es wird Use Case angetrieben
  • Abgrenzen Transaktionsgrenzen

So haben Sie eine Account erstellen können, zum Beispiel, wie

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();
    }

}

Sie müssen in der Regel ein Repository, wenn eine Aktion innerhalb der Service-Schicht durchgeführt wird. Sie können von Repository Denken als Datenprovider und Lagerung . Hier sehen, wie ich meinen Repository implementieren.

Wenn Sie ein wartbar und lesbar HQL Abfrage , ich rate Ihnen, Ihre HQL-Abfragen in einer multline und externalisierte XML-Datei externalisieren

<?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>

So in Ihrem Swing-GUI-Ereignisse, können Sie Ihre Service-Layer wie

nennen
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));
}

Und es ist keine gute Idee, um Ausdauer Aktionen in Ihrem Entity zu verwenden. Wenn Sie Persistenz damit zusammenhängende Fragen in Ihrem Entity ausführen müssen, ich denke, dass es besser ist, dass Sie Ihr Repository als Parameter an Ihre Entity geben

public class Account {

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

}

Vielleicht möchten Sie sehen? dieses Thema

ich Rat Sie einen Blick auf Java Persistence Nehmen Sie mit Hibernate Buch, Kapitel 9 (Arbeiten mit Objekten). ATT : sorgfältig lesen

UPDATE

  

Warum ist gut einen Service-Layer?

Zu allererst

  • Es ist Use Case angetrieben (Es zieht, was Ihre Anwendung tun sollte)

An zweiter Stelle von allen

  • Sie begrenzen Transaktionsgrenzen

Angenommen, hier geht die Service-Schicht

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();
    }

}

Beachten Sie nur eine Transaktionsgrenze definieren, anstatt jeden einzelnen innerhalb jedes POJO zu definieren. Und mehr, was passiert, ob Ihr Unternehmen Regel in Ihrer Swing-GUI Notwendigkeit, innerhalb eines anderen Komponente verwendet werden. Werden Sie verwenden, um ein Ctrl-c + Ctrl-v ???

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