2014-09-25 71 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