Hallo zusammen, ich hab hier ein kleines ausführbares Beispiel.
Irgendwie komm ich mit dem cascade und einer einfachen 1:n Beziehung nicht klar.
Ich versteh nicht, dass wenn ich eine Instanz von A erzeug und dann ein B hinzufüge, dass es zwar in a, dass b drin ist ABER nichts in der DB gespeichert ist warum???
Wenn ich aber davor das A suche und dann die gleiche Methode ausführe dann funktioniert es WARUM ich verstehs nicht so ganz…
Was mache ich falsch?? Oder gibt es eine bessern Ansatz? Weil ich würde gerne die Instanz dann eventuell in einem Model oder sontigem speichern aber bringt ja nichts, wenn dann nie was in der DB ankommt… Freue mich für jede Hilfe…
Wenn man das auskommentierte einkommentiert sieht man die beiden Fälle ganz schön.
package hibernate;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "A")
public class A implements Serializable {
private Integer id;
private List<B> bs ;
public A()
{
super();
bs = new ArrayList<B>();
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToMany(cascade = CascadeType.ALL)
public List<B> getBs() {
return bs;
}
public void setBs(List<B> bs) {
this.bs = bs;
}
public void addB(B b) {
bs.add(b);
}
public void removeB(B b) {
bs.remove(b);
}
}
package hibernate;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "B")
public class B implements Serializable{
private Integer id;
private Double value;
private String reason;
public void setId(Integer id) {
this.id = id;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setValue(Double value) {
this.value = value;
}
public Double getValue() {
return value;
}
public void setReason(String reason) {
this.reason = reason;
}
public String getReason() {
return reason;
}
}
package hibernate;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static SessionFactory sessionFactory;
public static void connect()
{
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
ex.printStackTrace();
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
package hibernate;
import org.hibernate.Session;
public class Main {
public static void main(String[] args) {
try {
HibernateUtil.connect();
A a = new A();
createA(a);
//würde gehen a = findA(0);
B b = new B();
b.setReason("test");
b.setValue(3.0);
addB(b, a);
System.out.println("a " + a.getBs().size());
System.out.println("find " + findA(1).getBs().size());
} catch (Exception e) {
e.printStackTrace();
HibernateUtil.getSessionFactory().close();
}
}
public static void createA(A a) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(a);
session.getTransaction().commit();
}
public static A findA(Integer id) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
return (A) session.load(A.class, id);
}
public static void addB(B b, A a) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
a.addB(b);
session.getTransaction().commit();
}
}
<?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">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<!--<property name="hibernate.archive.autodetection" value="class" />-->
<mapping class="hibernate.A"/>
<mapping class="hibernate.B"/>
</session-factory>
</hibernate-configuration>