2017-07-04 191 views
0

基本上我試圖實現一個觀察者模式,數據正在被存儲到數據庫中,但是在檢索它時顯示錯誤。 我想創建的是一組類別,所有葉節點都將包含questions.I正在學習休眠,所以任何形式的幫助將不勝感激。 錯誤在下面給出。Hibernate繼承映射

錯誤:在 org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)hierarchy.Component ...

這是一個組件類:無法解析屬性:的parent_child_id

@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(); 
} 
} 

這是一個類別類

@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; 
} 
} 

這是一個問題類

@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; 
} 
} 

這是主類

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(); 
} 

} 

回答

0

在你的顯示方法,你必須指定組件的PROPERTYNAME不列名在數據庫的變化:

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

由:

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