2017-08-16 92 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());