2017-08-16 73 views
0

我有一個簡單的namednativequery,它在爲REST Web服務插入時生成新的PK。如何從Insert語句返回主鍵Mysql Java Eclipselink

Message.java 
    @NamedNativeQueries({@NamedNativeQuery(name="Message.send", query="INSERT INTO Leaf.Message (MessageID,Status,Message,Description,SentTime,ipAdd) VALUES\n" + 
    "(null,?Status,?Message,NOW()),?ipAdd;")}) 


AbstractFacade.java 

public void CreateMessage(Message entity, InetAddress clientIP) { 
     try{ 
     javax.persistence.Query q = getEntityManager().createNamedQuery("Message.send",entityClass); 
     q.setParameter("Status", "send"); 
     q.setParameter("Message", entity.getMessage()); 
     q.setParameter("ipAdd",clientIP.hashCode()); 
     q.executeUpdate(); 

     } 
     catch(Exception e){ 
      String s= ""+e.getMessage().toString(); 
     }} 

如何獲得新創建的PK?它使用SELECT LAST_INSERT_ID()嗎?由於executeUpdate不返回結果?和ResultSet rs = q.getGeneratedKeys();這不是一個有效的語法。

+2

只是想知道什麼是使用JPA一樣,如果它是JDBC的地步? – dic19

+0

同意@ dic19。我的補充:在JPA控制的數據庫中的本地插入是非常糟糕的概念,違反了很多規則 –

回答

0

是的,對於MySQL,它將是LAST_INSERT_ID

但是,在你的情況下,使用EntityManager::persist會更有意義。例如,有一個看看Hibernate tutorial

EntityManager entityManager = entityManagerFactory.createEntityManager(); 
entityManager.getTransaction().begin(); 
entityManager.persist(new Event("Our very first event!", new Date())); 
entityManager.persist(new Event("A follow up event", new Date())); 
entityManager.getTransaction().commit(); 
entityManager.close(); 

在你的情況,你會通過的Message一個實例的persist方法。

persist之後又回來了,你可以直接調用getMessageID訪問實體的身份:

getEntityManager().persist(message); 
System.out.println("Inserted message: " + message.getMessageID());