2014-12-07 93 views
2

我试着开始使用EclipseLink的@UuidGenerator annonation进行ID生成,但它与NPE失败。EclipseLink的@UuidGenerator导致NullPointerException

我正在使用Java EE 6 + GlassFish 4.1。实体是从servlet创建的。 EclipseLink版本是2.6.0-M3。简单的长ID“@GeneratedValue(strategy = GenerationType.AUTO)”工作正常。

实体代码:

@Entity 
@UuidGenerator(name="QUANTITY_GEN") 
public class Quantity implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(generator = "QUANTITY_GEN") 
    private String id; 

... 

} 

servlet代码:

@WebServlet(name = "Qtest", urlPatterns = 
{ 
    "/Qtest" 
}) 
public class Qtest extends HttpServlet 
{ 
    @EJB 
    private QuantityFacade quantityFacade; 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     ... 

     Quantity qt = new Quantity(); 
     quantityFacade.create(qt); 

     ... 
    } 
} 

跟踪:

Caused by: java.lang.NullPointerException 
    at org.eclipse.persistence.internal.sequencing.SequencingManager.getNextValue(SequencingManager.java:1067) 
    at org.eclipse.persistence.internal.sequencing.ClientSessionSequencing.getNextValue(ClientSessionSequencing.java:70) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:361) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:320) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.assignSequenceNumber(UnitOfWorkImpl.java:486) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:4290) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:518) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4235) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496) 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:287) 
    at uuidtest.AbstractFacade.create(AbstractFacade.java:24) 

请指教也许有一些明显的错误?

+0

实际上,这个@UuidGenerator似乎没有很大的需求。它的记录很糟糕,只能生成字符串表示而不可能使用UUID。 – 2014-12-07 22:51:27

回答

1

我用下面的代码摆脱这一问题的直接生成ID 。在使用BeanUtils.copyProperties()时,使用默认构造函数给我在使用组合键克隆实体时遇到了问题。因此我使用@PrePersist。这在第一次在数据库中创建一行之前被称为

@MappedSuperclass 
@Getter 
@Setter 
public abstract class AbstractMasterUUIDEntity extends AbstractMasterEntity<String> { 

    @Id 
    private String id; 

    @PrePersist 
    public void generateId() { 
     if(this.id == null) { 
      this.id = UUID.randomUUID().toString(); 
     } 
    } 

} 
相关问题