访问没有主键的表 - 弹簧数据jpa

时间:2017-03-30 09:27:33

标签: spring-boot spring-data-jpa

我正在使用spring数据jpa,我必须将现有应用程序移植到Spring启动。

我遇到的数据库表没有主键列。如何在没有@Id注释的情况下编写实体。

如果我正在尝试,我会收到错误:

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.example.domain.Employee
    at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:243) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:775) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
    ... 29 common frames omitted

有没有办法在不修改现有数据库的情况下使用它?

2 个答案:

答案 0 :(得分:1)

是的,使用@IdClass注释。

@Entity
@IdClass(EmployeeKey.class)
public class Employee {
   @Id
   private int id;
   @Id
   private int departmendId;

}


public class EmployeeKey implements Serializable {
   private int id;
   private int departmendId;
}


public interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey>,{}

答案 1 :(得分:-1)

即使基础表没有指定显式主键,我确信至少有一列被定义为唯一(或者为其指定了唯一索引)。

您可以将@Id注释添加到与该列相关的实体字段中,这对于持久性提供程序就足够了。你当然可能不想指定任何生成器。

如果您碰巧有一些可以形成一种自然键的唯一列,那么您可以使用实体中的@EmbeddedId策略或@IdClass策略指定复合键。