我正在尝试使用Netbeans 7.01来学习JSF 2.0和JPA的教程。我正在使用oracle XE和JDBC_6。我使用了来自实体向导的JSF页面来生成我的JSF页面。一切正常,因为我可以从数据库中检索数据并显示它们。但是,当我尝试在数据库中创建或更新记录时,出现此错误:
为查找操作
错误地提供了空PK的实例
这是如何引起的?如何解决?
答案 0 :(得分:10)
这基本上意味着您执行了以下操作:
Entity entity = em.find(Entity.class, null);
请注意,此处PK为null
。要解决您的问题,请确保其不 null
。
答案 1 :(得分:4)
这可能是因为您正在对尚未持久化的实体运行查找操作。在哪种情况下,@ ID字段(如果它是自动生成的)将没有值,即。它将为null。然后你试图找到实体,并且正如@BalusC所指出的那样,你正在向你的find方法发送一个空值。
答案 2 :(得分:2)
这意味着当您尝试持久化实体时,您将实体的PK发送为null。
所以你有三个选择:
如果您的数据库使用类似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