tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
2508
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    e.motion e.motion ist offline Mitglied Silber
    Registriert seit
    Oct 2002
    Ort
    Stuttgart
    Beiträge
    69
    Hallo,

    HibernateConnection Klasse:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    public class ConnectionFactory
    {
     
        private static ConnectionFactory instance = null;
        private SessionFactory sessionFactory = null;
     
        private ConnectionFactory()
        {
            try
            {
                sessionFactory = new Configuration().configure().buildSessionFactory();
     
            }
            catch (MappingException e)
            {
                System.err.println("Mapping Exception" + e.getMessage());
                throw new RuntimeException(e);
            }
            catch (HibernateException e)
            {
                System.err.println("Hibernate Exception" + e.getMessage());
                throw new RuntimeException(e);
            }
     
        }
     
        public static synchronized ConnectionFactory getInstance()
        {
            if (instance == null)
            {
                instance = new ConnectionFactory();
            }
            return instance;
        }
     
        public Session getSession()
        {
            try
            {
                Session s = sessionFactory.openSession();
                return s;
            }
            catch (HibernateException e)
            {
                System.err.println("Hibernate Exception" + e.getMessage());
                throw new RuntimeException(e);
            }
        }
     
    }

    2 Beispiel POJOs:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    public class Packet
    {
        private PacketCategory packetCategory;
     
        public Packet()
        {
        }
        
        public PacketCategory getPacketCategory()
        {
            return packetCategory;
        }
        
        public void setPacketCategory(PacketCategory packetCategory)
        {
            this.packetCategory = packetCategory;
        }
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    public class PacketCategory
    {
        private SortedSet packets = new TreeSet();
     
        public SortedSet getPackets()
        {
            return packets;
        }
        
        public void setPackets(SortedSet packets)
        {
            this.packets = packets;
        }
    }

    PacketCategoryService (DAO)Klasse:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    
    public class PacketCategoryService
    {
        public static PacketCategoryService instance;
        
        public PacketCategoryService()
        {
        }
        
        public static synchronized PacketCategoryService getInstance()
        {
            if (instance == null)
            {
                instance = new PacketCategoryService();
            }
            return instance;
        }
     
        
        public PacketCategory getPacketCategory(int primaryKey)
        {
            Session session = ConnectionFactory.getInstance().getSession();
            
            try
            {
                return (PacketCategory)session.load(PacketCategory.class, new Integer(primaryKey));
            }
            catch (ObjectNotFoundException onfe)
            {
                return null;
            }
            catch (HibernateException e)
            {
                System.err.println("Hibernate Exception" + e.getMessage());
                throw new RuntimeException(e);
            }
            finally
            {
                if (session != null)
                {
                    try
                    {
                        session.close();
                    }
                    catch (HibernateException e)
                    {
                        System.err.println("Hibernate Exception" + e.getMessage());
                        throw new RuntimeException(e);
                    }
     
                }
            }
            
        }
        
        public List getPacketCategoryList()
        {
            Session session = ConnectionFactory.getInstance().getSession();
     
            try
            {
                Query query = session.createQuery("select packetCategory from model.PacketCategory as packetCategory");
                return query.list();
            }
            catch (HibernateException e)
            {
                System.err.println("Hibernate Exception" + e.getMessage());
                throw new RuntimeException(e);
            }
            finally
            {
                if (session != null)
                {
                    try
                    {
                        session.close();
                    }
                    catch (HibernateException e)
                    {
                        System.err.println("Hibernate Exception" + e.getMessage());
                        throw new RuntimeException(e);
                    }
                }
            }
        }
    }

    Wenn ich über das ServiceObjekt jetzt alle PacketCategories auslese(getPacketCategoryList), kann ich ja leider nicht mehr auf die Packets zugreifen da die Session schon geschlossen ist und ich mit lazy="true" arbeite.

    Gibt es eine Möglichkeit weiterhin mit DAO Objekten zu arbeiten und die Packets auslesen zu können oder muss ich direkt in den Servlets den Hibernate Zugriff durchführen und dann nach Bedarf mit Hibernate.inizialize() arbeiten?

    MfG
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Normalerweise wird das DAO Pattern anders angewandt. Du hast zuerst mal einen Service. Dieser Service bietet verschiedene Business Methoden an. Innerhalb dieser Business Methoden verwendest du das DAO um Pojos zu persistieren oder aus dem persistenten Speicher zu laden. Dabei könnte man beispielsweise Hibernate mit einem Transaktionsmanager Konfigurieren, so dass du beim Aufruf einer Service Methode eine neue Transaktion gestartet wird. Innerhalb dieser Service Methode können nun mehrere Methoden eines DAO's aufgerufen werden die innerhalb der selben Transaktion laufen. Innerhalb einer Transaktion bekommt man immer die selbe Session. Die Session öffnet man dann vor dem Aufruf der Service Methode und nach dem Aufruf schließt man sie wieder. Das Springframework bietet mit den sogenannten TransactionProxy und der Klassen HibernateTransactionManager, TransactionProxyFactoryBean und HibernateDAOSupport erstklassige Unterstützung für dieses Szenario und mal ganz neben bei -> funktioniert wunderbar ... außerdem muss man sich wenn man mit Springs HibernateDAOSupport arbeitet icht mehr um einen etwaigen Session-Lifecycle kümmern (open(),close()... beginTransaction(), commit(), dass übernimmt alles Spring für uns )

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    e.motion e.motion ist offline Mitglied Silber
    Registriert seit
    Oct 2002
    Ort
    Stuttgart
    Beiträge
    69
    Vielen Dank.Werde mir mal das Spring Framework anschauen.

    Gruß e.motion
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Hier mal ein "kleines" Beispiel für die Anwendung des Spring Frameworks mit Hibernate.

    Gruß Tom
    Angehängte Dateien Angehängte Dateien
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    e.motion e.motion ist offline Mitglied Silber
    Registriert seit
    Oct 2002
    Ort
    Stuttgart
    Beiträge
    69
    Hey vielen Dank,
    werds gleich mal ausprobieren

    Gruß
    e.motion
     

  6. #6
    e.motion e.motion ist offline Mitglied Silber
    Registriert seit
    Oct 2002
    Ort
    Stuttgart
    Beiträge
    69
    Hallo,

    das Beispielist einleuchtent.

    Aber wie mach ich des Wenn zum Beispiel die "PacketCategories" die "Packets" enthalten und die wiederrum "Features" usw...

    Müsst ich dann im PacketCategoryService ne Methode schreiben "getAllWithPacketsWithFeaturesWith.....()" vom Typ List in der ich dann mit Hibernate.inizialize() alle Objekte inizialisieren und die List dann über das Request-Objekt an die Tiles weitergeben?

    Dies wäre ziemlich umständlich da diese Hirarchie manchmal sehr weit geht. Gibts da keinen anderen Ansatz?

    Gruß
    e.motion
     

  7. #7
    Registriert seit
    Feb 2004
    Beiträge
    592
    Hi,

    du hast den DAOSupport wie Thomas schon sagt um persistente Objects zu laden oder zu "Persistieren".

    Dann hast du einen Service in dem du dir die Daten anhand des DAO's besorgst und anschließend für dein Servlets (Controller) aufbereitest. Das heißt du wirst nicht das persistente Object an das Servlet leiten sondern ein Dto (DataTransferObject) oder CommandObject.

    Gruß

    Romsl
     

  8. #8
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Das heißt du wirst nicht das persistente Object an das Servlet leiten sondern ein Dto (DataTransferObject) oder CommandObject.
    In der Regel ist es aber doch so, dass man gerade wegen der Verwendung von Hibernate nicht mehr auf spezielle DTO's bzw. VO's angewiesen ist, da man die normalen Pojos als "Transportmittel" verwendet.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Hibernate Persistence.xml - Sinnvoller Wert für hibernate.hbm2ddl.auto
    Von Herr_M im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 08.10.08, 08:21
  2. Hibernate: Mapping v. Beziehungen und was Hibernate daraus macht
    Von DerGrinsemann im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 14.08.08, 12:53
  3. JSF - Hibernate - Exception bei Update (org.hibernate.NonUniqueObjectException)
    Von alan79 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 04.04.08, 06:44
  4. Antworten: 2
    Letzter Beitrag: 13.06.07, 09:24
  5. Antworten: 1
    Letzter Beitrag: 25.01.06, 17:59