Java 将没有主键的SQL视图映射到JPA实体
在我的Java应用程序中,我希望使用JPA获取存储在Oracle数据库中的信息。 在我的数据库中,我有一个视图,其中包含一组从其他一些表中获取的列。我想绘制那个视图。但是,我的视图没有主键,因此无法创建JPA实体。我考虑过使用两列作为外键Java 将没有主键的SQL视图映射到JPA实体,java,sql,hibernate,jpa,foreign-keys,Java,Sql,Hibernate,Jpa,Foreign Keys,在我的Java应用程序中,我希望使用JPA获取存储在Oracle数据库中的信息。 在我的数据库中,我有一个视图,其中包含一组从其他一些表中获取的列。我想绘制那个视图。但是,我的视图没有主键,因此无法创建JPA实体。我考虑过使用两列作为外键 实现这一点的最佳方式是什么?我见过很多不同的方法,我无法决定哪种方法最适合这种情况。没有最好的方法。因为这是一个视图,所以您永远不会在其中插入任何数据,这意味着您可以简单地在任何现有字段上定义主键。您还可以尝试用insertable=false,updatea
实现这一点的最佳方式是什么?我见过很多不同的方法,我无法决定哪种方法最适合这种情况。没有最好的方法。因为这是一个视图,所以您永远不会在其中插入任何数据,这意味着您可以简单地在任何现有字段上定义主键。您还可以尝试用
insertable=false,updateable=false
标记该字段
更新
您更了解您的数据,但通常在视图中,您不能保证所有记录都是唯一的,这就是为什么您通常应该避免从视图中直接使用实体的原因。我建议使用包装器类,比如:
SELECT new com.domain.MyWrapper(field1, field2, field3, field4,...) FROM ViewEntity
解决此问题的一种方法是使用复合主键,只需将@Id注释添加到相应的字段。当我获取表中设置为主键的字段具有相同内容的行的信息时,这不起作用。没有给出任何错误,但信息发生了更改。更新了响应。如果我不久前看到了你的答案,我就不会查看数据库并将其映射为实体。独特性扼杀了我的应用程序报告,而我几乎因此放弃了我的项目。。。谢谢Hanks,使用复合主键(带有@IdClass注释)解决了我的问题。谢谢这是解决方案,将@Id添加到视图解决了我的问题,我正在使用Arquillian,因此我必须为视图添加实体,并添加另一个字段来添加主键