Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将没有主键的SQL视图映射到JPA实体_Java_Sql_Hibernate_Jpa_Foreign Keys - Fatal编程技术网

Java 将没有主键的SQL视图映射到JPA实体

Java 将没有主键的SQL视图映射到JPA实体,java,sql,hibernate,jpa,foreign-keys,Java,Sql,Hibernate,Jpa,Foreign Keys,在我的Java应用程序中,我希望使用JPA获取存储在Oracle数据库中的信息。 在我的数据库中,我有一个视图,其中包含一组从其他一些表中获取的列。我想绘制那个视图。但是,我的视图没有主键,因此无法创建JPA实体。我考虑过使用两列作为外键 实现这一点的最佳方式是什么?我见过很多不同的方法,我无法决定哪种方法最适合这种情况。没有最好的方法。因为这是一个视图,所以您永远不会在其中插入任何数据,这意味着您可以简单地在任何现有字段上定义主键。您还可以尝试用insertable=false,updatea

在我的Java应用程序中,我希望使用JPA获取存储在Oracle数据库中的信息。 在我的数据库中,我有一个视图,其中包含一组从其他一些表中获取的列。我想绘制那个视图。但是,我的视图没有主键,因此无法创建JPA实体。我考虑过使用两列作为外键


实现这一点的最佳方式是什么?我见过很多不同的方法,我无法决定哪种方法最适合这种情况。

没有最好的方法。因为这是一个视图,所以您永远不会在其中插入任何数据,这意味着您可以简单地在任何现有字段上定义主键。您还可以尝试用
insertable=false,updateable=false
标记该字段

更新

您更了解您的数据,但通常在视图中,您不能保证所有记录都是唯一的,这就是为什么您通常应该避免从视图中直接使用实体的原因。我建议使用包装器类,比如:

SELECT new com.domain.MyWrapper(field1, field2, field3, field4,...) FROM ViewEntity

解决此问题的一种方法是使用复合主键,只需将@Id注释添加到相应的字段。

当我获取表中设置为主键的字段具有相同内容的行的信息时,这不起作用。没有给出任何错误,但信息发生了更改。更新了响应。如果我不久前看到了你的答案,我就不会查看数据库并将其映射为实体。独特性扼杀了我的应用程序报告,而我几乎因此放弃了我的项目。。。谢谢Hanks,使用复合主键(带有@IdClass注释)解决了我的问题。谢谢这是解决方案,将@Id添加到视图解决了我的问题,我正在使用Arquillian,因此我必须为视图添加实体,并添加另一个字段来添加主键