2014-09-25 63 views
1


我使用Hibernate的Web項目,其中有兩個不同的類(節點,接口)休眠:添加子到父集合

節點

@Entity 
@Table(name="NODES") 
public class Node { 
    //... 

    @OneToMany(mappedBy="node", cascade={CascadeType.ALL, CascadeType.MERGE, CascadeType.PERSIST}, orphanRemoval=true) 
    private Set<Interface> interfaces = new HashSet<>(); 

    //... 

} 

接口

@Entity 
@Table(name="INTERFACES") 
public class Interface { 
    //... 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="REF_NODE") 
    private Node node; 

    //... 
} 

一切都很好,
我的問題是我如何添加一個接口(chlid)到一個節點(父)已經持續?意味着如果我已經在數據庫中有2個接口的節點,例如我想添加第三個接口,我該怎麼做呢?

我的第一個快速的解決方案是使用原生SQL在Hibernate中,像這樣的:

public void addInteface(Interface i, Long idNode) { 
    //OpenSession.. 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 

    try { 
     //Start transaction 
     tx = session.beginTransaction(); 

     //Native SQL in Hibernate 
     SQLQuery query = session.createSQLQuery("INSERT INTO INTERFACES (ID_INTERFACE, ALIAS, ID_NODE) VALUES (NULL, :Alias, :idNode)"); 

     query.setParameter("ifAlias", i.getAlias()); 
     query.setParameter("refNode", idNode); 
     //Some other parameters... 

     //Execute and Commit 
     query.executeUpdate(); 
     tx.commit(); 

    } catch (Exception e) { 
     if (tx != null) tx.rollback(); 
     throw e; 

    } finally { 
     session.close(); 
    } 
} 

它的工作原理,但它不是最好的解決辦法,我相信。

注:我發現一些主題在這裏與幾乎相同的標題,但沒有回答我的問題。

回答

3

它可以通過兩種方式完成。

第一種選擇:

node.getInterfaces().add(new Interface(....)); // you have orphan removal to true, this will work 
session.saveOrUpdate(node); 
tx.commit(); 
session.close(); 

或者

第二個選項

newInterface.setNode(nodeObject); 
session.saveOrUpdate(newInterface); 
tx.commit(); 
session.close(); 

在上述2種方法,第2個選項,相比第一個的偉大工程。當你調用getInterfaces()時,第一個將會拉動所有的孩子,但這並不會更好。

1

//語法可能無法在一點上,也有一些psuedcode

比方說,你想添加一個ID是1到節點的接口:

Query query = session.createQuery("Select n from Node n where n.id = '1'");//JPQL 
Node n = query.getSingleResult(); 

然後你會做一個新的接口

Interface i = new Interface(); 

然後設置變量,你想要什麼,但也設置節點

i.setVariables(..); 
i.setNode(n); 

然後更新

session.merge(i); 

現在,這一切都是假設生成的ID是正確的,這樣的。

+0

謝謝你的回答:) – 2014-09-25 17:25:45