持久性错误消息:为查找操作错误地提供了空PK的实例

时间:2011-11-28 19:21:47

标签: java jsf jpa netbeans

我正在尝试使用Netbeans 7.01来学习JSF 2.0和JPA的教程。我正在使用oracle XE和JDBC_6。我使用了来自实体向导的JSF页面来生成我的JSF页面。一切正常,因为我可以从数据库中检索数据并显示它们。但是,当我尝试在数据库中创建或更新记录时,出现此错误:

  

为查找操作

错误地提供了空PK的实例

这是如何引起的?如何解决?

3 个答案:

答案 0 :(得分:10)

这基本上意味着您执行了以下操作:

Entity entity = em.find(Entity.class, null);

请注意,此处PK为null。要解决您的问题,请确保其 null

答案 1 :(得分:4)

这可能是因为您正在对尚未持久化的实体运行查找操作。在哪种情况下,@ ID字段(如果它是自动生成的)将没有值,即。它将为null。然后你试图找到实体,并且正如@BalusC所指出的那样,你正在向你的find方法发送一个空值。

答案 2 :(得分:2)

这意味着当您尝试持久化实体时,您将实体的PK发送为null。

所以你有三个选择:

  • 手动定义实体的PK。
  • 如果您的数据库使用类似Serial(Informix,MS SQLSERVER等)的类型,那么该值将由RDMS自动增加,您可以使用IDENTITY策略,因此现在您可以为您的实体传递空值' s pk。

    @Entity
    public class Inventory implements Serializable { 
            @Id
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            private long id;
    
  • 如果您的数据库使用序列生成pks(Oracle,Postgresql等),则值由序列提供,以便您可以使用:

    @Entity
    public class Inventory implements Serializable {
        @Id
        @GeneratedValue(generator="InvSeq")
        @SequenceGenerator(name="InvSeq",sequenceName="INV_SEQ", allocationSize=5)
        private long id;
    

有关详细信息,请参阅:http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey