2017-07-04 4 views
0

Grundsätzlich versuche ich ein Observer-Muster zu implementieren, Daten werden in der Datenbank gespeichert, aber die while-Abfrage zeigt einen Fehler. Was ich versuche zu erstellen ist eine Reihe von Kategorien und alle Blatt Knoten enthalten Fragen. Ich lerne Hibernate, so dass jede Art von Hilfe geschätzt wird. Fehler ist unten angegeben.Hibernate Vererbung Mapping

ERROR: konnte nicht Eigentum beheben: parent_child_id von: hierarchy.Component bei org.hibernate.persister.entity.AbstractPropertyMapping.propertyException (AbstractPropertyMapping.java:83) ...

Dies ist eine Klasse Component

@Entity 
@Table(name = "Component") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) 
public abstract class Component { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int component_id; 
private String name; 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "parent_child_id") 
private Component parent; 

public Component() { 

} 

public Component(String name, Component parent) { 
    super(); 
    this.name = name; 
    this.parent = parent; 
} 

public int getComponent_id() { 
    return component_id; 
} 

public void setComponent_id(int component_id) { 
    this.component_id = component_id; 
} 

public String getName() { 
    return name; 
} 

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

/*public abstract Iterator<Component> getChildren(); 

public abstract Component getParent();*/ 

public List<Component> getChildren() { 
    throw new UnsupportedOperationException(); 
} 

public void setParent(Component parent) { 
    this.parent = parent; 
} 

public Component getParent() { 
    return this.parent; 
} 

public void setSize(int size) { 
    throw new UnsupportedOperationException(); 
} 

public int getSize() { 
    throw new UnsupportedOperationException(); 
} 
} 

Dies ist eine Kategorie Klasse

@Entity 
public class Category extends Component { 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent") 
private List<Component> children = new ArrayList<Component>(0); 


public Category() { 

} 

public Category(String name, Component parent) { 
    super(name, parent); 
} 

@Override 
public List<Component> getChildren() { 
    return children; 
} 
} 

Dies ist eine Frage der Klasse

@Entity 
public class Question extends Component { 

private int size; 

public Question() { 

} 

public Question(String name, Component parent) { 
    super(name, parent); 
} 

@Override 
public void setSize(int size) { 
    this.size = size; 
} 

@Override 
public int getSize() { 
    return this.size; 
} 
} 

Und das ist die Hauptklasse

public class Main { 

private SessionFactory factory; 

public Main() { 
    factory = HibieUtil.getSessionFactory(); 
} 

public void insertData(Component root) { 
    Session sessie = factory.openSession(); 
    Transaction transaction = null; 
    try { 
     transaction = sessie.beginTransaction(); 
     sessie.save(root); 
     transaction.commit(); 
    } catch(HibernateException e) { 
     if(transaction != null) 
      transaction.rollback(); 
     e.printStackTrace(); 
    } finally { 
     sessie.close(); 
    } 
} 

public void showData(Component node) { 
    if(node == null) return; 
    System.out.println(node.getName()); 
    Iterator<Component> children = node.getChildren().iterator(); 
    while(children.hasNext()) 
     showData(children.next()); 
} 

public void display() { 
    Session sessie = factory.openSession(); 
    Transaction transaction = null; 
    try { 
     transaction = sessie.beginTransaction(); 
     Criteria criteria = sessie.createCriteria(Component.class); 
     criteria.add(Restrictions.eq("parent_child_id", null)); 

     @SuppressWarnings("unchecked") 
     List<Component> result = criteria.list(); 
     if(result != null) 
      showData(result.get(0)); 
     transaction.commit(); 
    } catch(HibernateException e) { 
     if(transaction != null) 
      transaction.rollback(); 
     e.printStackTrace(); 
    } finally { 
     sessie.close(); 
    } 
} 

public static void main(String[] args) { 
    Main main = new Main(); 
    Component root = new Category("Root", null); 
    Component childA = new Category("ChildA", root); 
    Component childB = new Category("ChildB", root); 
    root.getChildren().add(childA); 
    root.getChildren().add(childB); 
    Component questionA = new Question("Question A", childA); 
    questionA.setSize(10); 
    Component quesitonB = new Question("Question B", childA); 
    quesitonB.setSize(5); 
    childA.getChildren().add(questionA); 
    childA.getChildren().add(quesitonB); 
    main.insertData(root); 
    main.display(); 
} 

} 

Antwort

0

In Ihrem Anzeigeverfahren Sie Eigenschaftsnamen der Komponente nicht die Spaltennamen in der Datenbank ändern angeben muss:

criteria.add(Restrictions.eq("parent_child_id", null)); 

von:

criteria.add(Restrictions.eq("parent", null));