我正在使用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
有没有办法在不修改现有数据库的情况下使用它?
答案 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
策略指定复合键。