PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hibernate mit Annotationen



spite
11.07.2008, 13:46
Hallo,
ich werde einfach nicht schlau und darum auch keinen Schritt weiter. Muss ich wenn ich mit Hibernate (http://www.hibernate.org/) erst eine XML Mapping erstellen und dann die Annotationen einfügen oder ist es entweder oder?
Ich habe mir zwar das Buch Hibernate, das Praxisbuch für Entwickler (http://www.galileocomputing.de/katalog/buecher/titel/gp/titelID-978?GalileoSession=83960028A3-H0C-A17o) vom Galileo Verlag zugelegt aber ich werde nicht schlau daraus ?(
Kennt jemand gute Links zum Thema Hibernate mit Annotationen?
Danke und Gruss
René

Stollentroll
11.07.2008, 14:15
Wenn ich dich richtig verstehe (und mein Wissen das auch nur aus einer Vorlesung die ich vor nem Jahr gehört hab noch vollständig und richtig ist):
Du kannst entweder Klassen mit XML mappen oder Annotationen benutzen.
Irgendwelche XML-Config-Dateien brauchst du natürlich trotzdem, damit das Hibernate die Datenbank findet. :D

http://pdbm.de/lehre/skripte.html

Unter Foliensätze, JPA/Hibernate

supersucker
11.07.2008, 14:21
ich werde einfach nicht schlau und darum auch keinen Schritt weiter. Muss ich wenn ich mit Hibernate erst eine XML Mapping erstellen und dann die Annotationen einfügen oder ist es entweder oder?

Es ist ein "entweder oder".

Ich würde dir empfehlen nur mit Annotations zu arbeiten, es sei denn du hast einen verdammt guten Grund xml-mappings selber zu erstellen.

spite
11.07.2008, 14:32
Ich würde dir empfehlen nur mit Annotations zu arbeiten, es sei denn du hast einen verdammt guten Grund xml-mappings selber zu erstellen.

Leider finde ich kein Beispiel, dass die Annotations einfach erklärt und dann auch noch funktioniert (ganzer Quellcode und nicht nur Fragmente). Vielleicht ist es einfach nur zu Heiss und zu Laut im Büro, damit ich das nicht kapiere :think:

supersucker
11.07.2008, 14:51
Leider finde ich kein Beispiel, dass die Annotations einfach erklärt und dann auch noch funktioniert (ganzer Quellcode und nicht nur Fragmente). Vielleicht ist es einfach nur zu Heiss und zu Laut im Büro, damit ich das nicht kapiere

Ich kenn das Problem.....:devil:

Im Prinzip brauchst du da wirklich ein gutes Buch, nur Netz-Recherche ist bei so Sachen wie Hibernate extrem mühselig.

Ich hab das gleiche Buch wie du, da ist das doch recht gut erklärt? (finde ich)

Welcher Teil ist dir denn unklar?

spite
11.07.2008, 15:39
Welcher Teil ist dir denn unklar?
Für mich ist der Code zu zerpflückt und nicht als ein Script aufgelistet, das verwirrt mich momentan. Vielleicht fehlt mir einfach nur die Praxis.

Wenn ich den Code abtippe denke ich ich habe ihn begriffen aber dann kommt ein Exception und ich stehe vor dem Nichts.

supersucker
11.07.2008, 16:02
Na dann zeig doch mal deine Sourcen - auf das Wesentliche reduziert natürlich.

spite
11.07.2008, 16:16
Ich habe nun die Sourcen, vom Buch (Download) genommen und die Konfiguration angepasst.



<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="myeclipse.connection.profile">
learninghibernate
</property>

<!-- mysql configuration -->
<property name="connection.url">jdbc:mysql://mydbserver/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.password">pword</property>

<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<property name="current_session_context_class">thread</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="transaction.auto_close_session">true</property>
<mapping class="de.laliluna.example.Honey" />
<mapping class="de.laliluna.example.Bee" />
</session-factory>
</hibernate-configuration>


Doch trotzdem kommt folgende Exception


java.lang.NoClassDefFoundError: de/laliluna/example/TestExample
Caused by: java.lang.ClassNotFoundException: de.laliluna.example.TestExample
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Exception in thread "main"


Das im ersten Kapitel macht mich fertig ?(

supersucker
11.07.2008, 16:29
Die Standard-Antwort: Mit deinem Classpath stimmt was nicht.

Zeig mal deine main-Methode + wie du das ganze versuchst zu starten.

spite
15.07.2008, 10:06
Sorry, das ich erst jetzt antworte aber ich konnte nicht schneller.

Ich starte aus Eclipse die main Methode.


public static void main(String[] args) {
try {
clean();
createHoney();
createRelation();
delete();
update();
query();
initBees();
} catch (RuntimeException e) {
try {
Session session = InitSessionFactory.getInstance()
.getCurrentSession();
if (session.getTransaction().isActive())
session.getTransaction().rollback();
} catch (HibernateException e1) {
log.error("Error rolling back transaction");
}
throw e;
}
}

supersucker
15.07.2008, 11:55
Also jetzt Moment Mal:

Ist die hier:

de/laliluna/example/TestExample

im Class-Path?

Was sagt denn eclipse im "view" "Problems"?

Das wir hier mal vorankommen: Poste mal alles was du hast -> alle Klassen und DDs (== Deployment Descriptors)

spite
15.07.2008, 13:28
Ohje, es scheint so, dass ich was rudimentäres nicht begreiffe :erschlag:



/**
* Copyright 2007 laliluna.de
* Sebastian Hennebrueder
*/
package de.laliluna.example;

import java.io.Serializable;
import java.text.MessageFormat;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;

/**
* @author Sebastian Hennebrueder
*/
@Entity
public class Bee implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "bee_gen")
@SequenceGenerator(name = "bee_gen", sequenceName = "bee_id_seq")
// for MySQL use GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

private String name;

@ManyToOne
@JoinColumn
private Honey honey;

public Bee() {

}

public Bee(String name) {
this.name = name;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

/**
* @return the honey
*/
public Honey getHoney() {
return honey;
}

/**
* @param honey
* the honey to set
*/
public void setHoney(Honey honey) {
this.honey = honey;
}

public String toString() {
return MessageFormat.format("{0}: id={1}, name={2}", new Object[] {
getClass().getSimpleName(), id, name });
}
}



/**
* Copyright 2006 laliluna.de
* Sebastian Hennebrueder
*/
package de.laliluna.example;

/**
* @author hennebrueder
*
*/
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
@Entity
@SequenceGenerator(name = "honey_seq", sequenceName = "honey_id_seq")
public class Honey implements Serializable {
private static final long serialVersionUID = 6789761254603569794L;

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="honey_seq")
// for MySQL use GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

private String name;

private String taste;

@OneToMany(mappedBy="honey")
private Set<Bee> bees = new HashSet<Bee>();

public Honey() {
super();
}

@Override
public String toString() {
return MessageFormat.format("Honey: {0} {1} {2}", new Object[]{id, name, taste});
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getTaste() {
return taste;
}

public void setTaste(String taste) {
this.taste = taste;
}

/**
* @return the bees
*/
public Set<Bee> getBees() {
return bees;
}

/**
* @param bees the bees to set
*/
public void setBees(Set<Bee> bees) {
this.bees = bees;
}



}



/**
* Test application for example
* @author Sebastian Hennebrueder
* created Jan 16, 2006
* copyright 2007 by http://www.laliluna.de
*/

package de.laliluna.example;

import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.transform.DistinctRootEntityResultTr ansformer;
import de.laliluna.hibernate.InitSessionFactory;

public class TestExample {

private static Logger log = Logger.getLogger(TestExample.class);

public static void main(String[] args) {
try {
/* clean tables */
clean();

/* simple create example */
createHoney();

/* relation example */
createRelation();

/* delete example */
delete();
/* update example */
update();

/* query example */
query();

/* show how to initialize data */
initBees();
} catch (RuntimeException e) {
/*
* we must take care to rollback all transaction and to close the
* session after an exception has occured. <pre> The session is
* closed by our configuration, when we rollback the session. See
* current_session_context </pre>
*/
try {
Session session = InitSessionFactory.getInstance()
.getCurrentSession();
if (session.getTransaction().isActive())
session.getTransaction().rollback();
} catch (HibernateException e1) {
log.error("Error rolling back transaction");
}
// throw the exception again
throw e;
}
}

/**
* creates and updates a honey
*/
private static void update() {
Honey honey = createHoney();

Session session = InitSessionFactory.getInstance().getCurrentSession ();
Transaction tx = session.beginTransaction();

honey.setName("Modern style");
session.update(honey);
tx.commit();
}

/**
* creates a honey and deletes it afterwards
*/
private static void delete() {

Honey honey = createHoney();

Session session = InitSessionFactory.getInstance().getCurrentSession ();
Transaction tx = session.beginTransaction();
session.delete(honey);
tx.commit();

}

/**
* deletes all bees and honeys.
*/
private static void clean() {
Session session = InitSessionFactory.getInstance().getCurrentSession ();
Transaction tx = session.beginTransaction();

session.createQuery("delete from Bee").executeUpdate();
session.createQuery("delete from Honey").executeUpdate();
session.flush();
session.clear();
tx.commit();

}

/**
* create a Honey and a Bee and a relation beween them
*/
private static void createRelation() {
Session session = InitSessionFactory.getInstance().getCurrentSession ();
Transaction tx = session.beginTransaction();
Honey honey = new Honey();
honey.setName("country honey");
honey.setTaste("Delicious");
session.save(honey);

Bee bee = new Bee("Sebastian");
session.save(bee);

/* create the relation on both sides */
bee.setHoney(honey);
honey.getBees().add(bee);
tx.commit();

}

/**
* Find and list Honey entries in the database
*/
private static void query() {
Session session = InitSessionFactory.getInstance().getCurrentSession ();
Transaction tx = session.beginTransaction();
List honeys = session.createQuery("select h from Honey as h").list();
for (Iterator iter = honeys.iterator(); iter.hasNext();) {
Honey element = (Honey) iter.next();
log.debug(element);
}
tx.commit();

}

/**
* load Honig and init bees
*/
private static void initBees() {
Session session = InitSessionFactory.getInstance().getCurrentSession ();
// appraoch a) generates 1 additional query for each honey
Transaction tx = session.beginTransaction();
List honeys = session.createQuery("select h from Honey as h").list();
for (Iterator iter = honeys.iterator(); iter.hasNext();) {
Honey element = (Honey) iter.next();
log.debug(element);
Hibernate.initialize(element.getBees());
}

// appraoch b) generates 1 query with a join
honeys = session.createQuery(
"select h from Honey as h left join fetch h.bees")
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTIT Y).list();
session.createCriteria(Honey.class)
.setFetchMode("bees", FetchMode.JOIN).setResultTransformer(
Criteria.DISTINCT_ROOT_ENTITY).list();

tx.commit();

}

/**
* Creates a honey object
*
* @return a fresh created Honey
*/
private static Honey createHoney() {
Honey forestHoney = new Honey();
forestHoney.setName("forest honey");
forestHoney.setTaste("very sweet");

Session session = InitSessionFactory.getInstance().getCurrentSession ();
Transaction tx = session.beginTransaction();

session.save(forestHoney);
tx.commit();

return forestHoney;

}
}



/**
*
* @author Sebastian Hennebrueder
* created Feb 22, 2006
* copyright 2006 by http://www.laliluna.de
*/
package de.laliluna.hibernate;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

/**
* @author hennebrueder This class garanties that only one single SessionFactory
* is instanciated and that the configuration is done thread safe as
* singleton. Actually it only wraps the Hibernate SessionFactory. When
* a JNDI name is configured the session is bound to to JNDI, else it is
* only saved locally. You are free to use any kind of JTA or Thread
* transactionFactories.
*/
public class InitSessionFactory {

/** The single instance of hibernate SessionFactory */
private static org.hibernate.SessionFactory sessionFactory;

/**
* Default constructor. It is private to guaranty singleton
*/
private InitSessionFactory() {
}

static {
final AnnotationConfiguration cfg = new AnnotationConfiguration();
/*
* configure Hibernate from hibernate.cfg.xml. This is expected to be in
* the class path = "src folder" = "root folder of classes"
*/
cfg.configure("/hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
}

/**
* Returns the single instance of the session factory
* @return
*/
public static SessionFactory getInstance() {
return sessionFactory;
}

}



<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
<property name="myeclipse.connection.profile">
learninghibernate
</property>
<!-- postgre SQL configuration
<property name="connection.url">
jdbc:postgresql://localhost:5432/learninghibernate
</property>
<property name="connection.username">postgres</property>
<property name="connection.password">p</property>
<property name="connection.driver_class">
org.postgresql.Driver
</property>
<property name="dialect">
org.hibernate.dialect.PostgreSQLDialect
</property>
-->

<!-- mysql configuration -->
<property name="connection.url">jdbc:mysql://research/hibernate</property>
<property name="connection.username">RedearchAdmin</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.password">admin</property>

<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<property name="current_session_context_class">thread</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="transaction.auto_close_session">true</property>
<mapping class="de.laliluna.example.Honey" />
<mapping class="de.laliluna.example.Bee" />

</session-factory>

</hibernate-configuration>



### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppe nder
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.Patt ernLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.Patte rnLayout
#log4j.appender.file.layout.ConversionPattern=%d{A BSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
log4j.logger.org.hibernate.SQL=info

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=info

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=info

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManag erConnectionProvider=trace

supersucker
15.07.2008, 13:56
Nicht böse gemeint, aber:

- wieviel Ahnung hast du von eclipse?

Das ist hier nämlich relevant.

Im Prinzip "stimmt das nämlich soweit".

Ich glaube eher, das du eclipse nicht richtig konfiguriert hast.

Nochmal:

1.)
Was sagt denn eclipse im "view" "Problems"? (Siehst du unter "Window" -> "Show view")

2.)
Klappt "Project" -> "Build Project"

3.)
Sind die hibernate libraries im Classpath? (Siehst du unter "Project" -> "Properties" -> "java build path" -> "Libraries")