如何从Insert语句返回主键Mysql Java Eclipselink

时间:2017-08-16 19:09:47

标签: java mysql rest jpa eclipselink

我有一个简单的namednativequery,可以在插入REST Web服务时生成新的PK。

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();不是一个有效的语法。

1 个答案:

答案 0 :(得分: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());