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