hibernate + dao

0

Czesc, mam do Was pytanie o rade z tematu hibernate + dao. Wiem ze spring ma ku temu wsparcie, jednak nie bardzo chce uzywac springa. Czemu? Bo bardzo slabo znam, a program mam niewielki i nie jestem pewna czy bede miala w tym wypadku z tego jakies super korzysci.

Mysle sobie o 2ch podejsciach:

  1. Mam moje klasy Entity, dla kazdej z osobna napisze XDaoInterfance i XDao (ktore implements odpowiedni XDaoInterface).

Ale mysle sobie ze operacje beda w wiekszosci te same - update/insert/delete/select - wiec w sumie po co mi dla kazdego entity osobne dao?

Mysle sobie wiec o czyms w tym rodzaju:

  1. Mam te moje klasy Entity (ktore implementuja Serializable), napisalabym
    DaoInterface, do tego po prostu glowne, wspolne Dao, ktore by mialo metody typu:
 
insert void (Serializable s){}

update void (Serializable s){}
//itd

zastanawiam sie tylko czy cos takiego jest poprawne z punktu widzenia inzynierii oprogramowania?

  1. Czy moze jednak powinnam uzyc tego Springa?

Bardzo prosze Was o rady i wskazowki!

  pzdr,
     misty
0

To co chcesz zaimplementować to chyba Active record pattern: http://en.wikipedia.org/wiki/Active_record_pattern#Java
Do małego projektu się nada, ale wg mnie ogólnie może spowodować zbyt duże sprzężenie z wykorzystywanym rozwiązaniem bazodanowym, utrudniając (znacznie) migrację. Z tym, że i tak mało kto zakłada późniejszą migrację (np z Hibernate na Hadoop), więc niby można to olać.

Disclaimer:
Mam małe doświadczenie z bazami danych :]

0

A powiedz mi, co ogolnie sadzisz bym jednak uzyla tego Springa? czytam sobie i patrze na przyklady i wyglada to calkiem zgrabnie.
Nie kumam tylko za bardzo spraw zwiazanych z konfiguracja - dla hibernate mam sobie hibernate.cfg.xml, tam sobie wpisuje mapping-class i jest ok. Nie mam zadnych xmli (i nie chce miec!).
W springu jak widze po przykladach, wrzucam konfiguracje (dane do polaczenia z baza) dla hibernate do pliku applicationContext.xml, ale czy moge sobie tez tam wrzucic mapping-class?

pzdr

0

Zdecydowalam sie jednak na springa i wykorzystanie HibernateDaoSupport. Mam jednak problem z konfiguracja applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

	<bean id="hibernateDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://locahost/test" />
		<property name="username" value="user" />
		<property name="password" value="pass" />
	</bean>

	<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

		<property name="dataSource" ref="hibernateDataSource" />
		<property name="schemaUpdate" value="true" />
		<property name="hibernateProperties">
			<value>
				hibernate.dialect = org.hibernate.dialect.MySQLDialect
				show_sql = true
				current_session_context_class = thread
       </value>
		</property>
		<property name="annotatedClasses">
			<list>
				<value>test.db.entity.TestEntity</value>
			</list>
		</property>
	</bean>

	<bean id="TestDAOImpl" class="test.db.dao.TestDAOImpl">
		<property name="sessionFactory" ref="hibernateSessionFactory" />
	</bean>

</beans>
 

Kod TestDAOImpl:

public class TestDAOImpl extends HibernateDaoSupport implements TestDAO {


    public void addTest(Test test) {
       // getHibernateTemplate().saveOrUpdate(test);
        if(getHibernateTemplate() == null){
            System.out.println("null");
        }else{
            System.out.println("nie null");
        }
    }

}
 

No i wlasnie getHibernateTemplate() jest null.. Czy ktos z Was ma moze pomysl czemu? Czego mi brakuje? Rozumiem ze skoro teraz konfig dla hibernate jest w applicationContext.xml to moglam wywalic hibernate.cfg.xml (co uczynilam)?

pzdr,
misty

0

sprobuj moze dodac adnotacje nad klasa testowa

@ContextConfiguration(locations = {"classpath:applicationContext.xml"})

0

Hej,
nie mam tego (tzn nie mam tego: @ContextConfiguration). Dodalam tylko

 		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>

do pom'a. Moze to za malo i mi nie dziala?
Tak sie zastanawiam - czy ja jakos nie musze tego getHibernateTemplate definiowac z applicationContext.xml? No bo w sumie niby jak on ma "kumac" ze ma byc zastepstwem do mojego session?

pzdr

0

ok olej to @Context..

sprobuj dodac

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/
    </bean>

0

Kurcze juz z tym kombinowalam tez i nic :/ tzn u mnie by chyba bylo:

 
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="hibernateSessionFactory"/
    </bean>

prawda? bo to ma wskazywac na : <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
?

czyli xml:

 
	 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 
        <bean id="hibernateDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 
                <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://locahost/test" />
                <property name="username" value="user" />
                <property name="password" value="pass" />
        </bean>
 
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="hibernateSessionFactory"/
    </bean>

        <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
 
                <property name="dataSource" ref="hibernateDataSource" />
                <property name="schemaUpdate" value="true" />
                <property name="hibernateProperties">
                        <value>
                                hibernate.dialect = org.hibernate.dialect.MySQLDialect
                                show_sql = true
                                current_session_context_class = thread
       </value>
                </property>
                <property name="annotatedClasses">
                        <list>
                                <value>test.db.entity.TestEntity</value>
                        </list>
                </property>
        </bean>
 
        <bean id="TestDAOImpl" class="test.db.dao.TestDAOImpl">
                <property name="sessionFactory" ref="hibernateSessionFactory" />
        </bean>
 
</beans>

ale jak mowilam - z tym tez nie poszlo :/ Powiedz mi gdzie on tworzy (albo powinien tworzyc) ten hibernateTemplate? gdzie i jak tworzy z niego a'la moja sesje?
bo on najwyrazniej nie jest inicjowany, a ze nie kumam gdzie/jak powinno sie to odbywac to i nie moge tego problemu rozwiazac :/ moze jednak ja powinnac hibernateTemplate jakos w kodzie utworzyc?

pzdr

0

nie mam takiego kodu przed oczami ale wydaje mi się, że korzystasz z HibernateDaoSupport, które pewnie jest klasą abstrakcyjną. Definiując bean hibernateTemplate ustawiasz tej klasie odpowiednie pole i to właśnie to dostajesz używając getHibernateTemplate();

mi się wydaję, że Tobie w ogóle tu spring nie wstrzykuje zależności. Spróbuj wstrzyknąć do swojej klasy jakiegoś stringa może.

Jak ten projekt nie jest jakąś tajemnicą to spakuj i wrzuć tutaj.

0

hej,
wlasnie sie skumalam ze nie usunelam hibernate.cfg.xml :| wiec caly czas program sobie korzystal z tego i nawet nie zagladal do applicationContext.xml ://
Teraz wywalilam juz tego hibernate.cfg.xml i dostalam :

org.hibernate.HibernateException: /hibernate.cfg.xml not found 

Przynamniej jakis trop. Powiedz mi prosze, jak powinnam teraz skonfigurowac aby czytane bylo applicationContext.xml?

pzdr

0

w web.xml

<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:applicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
0

Ja nie mam web.xml - to jest aplikacja j2se. Ale przeciez moge uzyc w niej springa?

0

Wiesz co, przekopiowalam to do projektu "Test" i wysylam tu. Jak bedziesz mial chwile i bedzie Ci sie chcialo to bede mega wdzieczna jak spojrzysz. Na pewno brakuje mi czegos oczywistego. Spakowalam caly projekt eclipse - jest tam main, 1 klasa entity, dao, daoImpl oraz klasa dla sessionFactory. Dolaczylam rowniez applicationContext.xml.

pzdr

1

spojrz teraz, nie krzyczy juz nullem ; )

0

hej!
Po pierwsze dziekuje ze chcialo Ci sie zajrzec :) Ja juz wlasnie tez jestem na etapie kombinowania z ApplicationContext :)
Niemniej jednak i w swojej, i w Twoim poprawionym Tescie otrzymuje:

org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;

doczytalam gdzies ze moge miec dubolowane biblioteki - i faktycznie w dependencies tak bylo. Uprzatnelam wiec pom'a i teraz jest ok (tzn nie dubluja sie liby), ale blad wystepuje ten sam. Mowi Ci moze ten blad cos? Googluje i nic :/

Swoja droga napotkalam na opinie ze z hibernate 4 nie powinnam uzywac tego HibernateDAOSupport - masz jakies zdanie w tym temacie? :)

pzdr,
misty

0

o tu moze pomoze ( w skrocie mieszanie hibernate 4 i springa 3 psuje nam zabawe ):

http://stackoverflow.com/questions/8799121/java-lang-nosuchmethoderror-org-hibernate-sessionfactory-opensessionlorg-hibe

daj znac jak sie uporasz bo ja juz dzis nie moge sie tym zajac.

0

Wiesz co, ja juz przejrzalam tego topica. I 10 innych. Pisza wlasnie o tym by uzyc wczesniejszej wersji Hibernate'a. Tak zrobilam - dostaje za to blad ktory mi wywalalo wczesniej:

 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateSessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

juz sily nie mam. Za kazdym razem gdy probuje dotknac Springa konczy sie to w ten sam sposob. Dzien w plecy i na koniec dnia nic. Chyba odpuszcze i zrobie zwykle DAO z uzyciem Hibernate'a. A ze Springiem nie zaprzyjaznie sie chyba nigdy, nie lubi mnie :(

Odstawiam temat do poniedzialku.
Jeszcze raz dzieki za pomoc i ze chcialo Ci sie czas poswiecic! Milego weekendu :)

   pzdr,
         misty
0

Jeny, nie uwierzysz - udalo sie!!! Jakos ciezko mi bylo odpuscic i kopalam dalej.. trzeba bylo dodac do pom'a jeszcze:

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.4</version>
		</dependency>

		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.12.1.GA</version>
		</dependency>
 

i poszlo! Wierzyc mi sie nie chce :)
Mega dzieki za pomoc :)))))

    pzdr,
             misty
0

dla spokojnego weekendu - że tak powiem 'u mnie dziala'. I nawet zapisuje to do bazy. Zmien sobie tylko usera i pass na swoj ( zmienilem wersje hibernate'a na 3 i wywalilem klase HibernateSessionFactory bo nie potrzebna )

0

Chyba napisalismy posta w tym samym momencie :) Poszlo mi, musialam tylko dodac 2 jary. Super! :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.