2014-12-07 38 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(); 
     } 
    } 

} 
相關問題