代码之家  ›  专栏  ›  技术社区  ›  tgr

JPA多重继承无法创建架构

  •  2
  • tgr  · 技术社区  · 6 年前

    我有一个具有多个继承层的数据模型。只要每一层只包含一个类,我就可以生成数据库模式。当我将另一个类添加到最后一个层时,在尝试生成模式时会得到一个异常:

    Exception Description: Predeployment of 
      PersistenceUnit [JPA] failed.
    Internal Exception: java.lang.NullPointerException
    

    我的数据模型实现如下:

    持久性.java

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Getter(value = AccessLevel.PROTECTED)
    @Setter(value = AccessLevel.NONE)
    @MappedSuperclass
    @IdClass(DatabaseId.class)
    public abstract class PersistentEntity {
    
      @Id
      @Column(name = "ID", nullable = false)
      @NonNull
      @Setter(value = AccessLevel.NONE)
      private UUID id;
    
      @Id
      @Column(name = "LAST_MODIFIED", nullable = false)
      @NonNull
      @Setter(value = AccessLevel.NONE)
      private LocalDateTime lastModified;
    
    }
    

    预订.java

    @EqualsAndHashCode(callSuper = true)
    @Data
    @NoArgsConstructor
    @Setter(AccessLevel.NONE)
    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @Table(name = "BOOKINGS", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"TARGETCASHREGISTER", "BOOKINGNUMBER"})
    })
    public class Booking extends PersistentEntity {
    
      @Column(nullable = false, precision = 36, scale = 2)
      @DecimalMin("0.01")
      @NonNull
      private BigDecimal amount;
      @Column(nullable = false)
      @NonNull
      private String text;
      @Column(nullable = false)
      private boolean isInPayment;
      @Column(nullable = false)
      @NonNull
      private UUID targetCashRegister;
      @Column(nullable = false)
      private long bookingNumber;
      @Column(nullable = false)
      @NonNull
      private String affiliate;
      @Transient
      private boolean isAnnulated = false;
    
      ...
    }
    

    现金贡献.java

    @EqualsAndHashCode(callSuper = true)
    @NoArgsConstructor
    @Entity
    @Table(name = "CASHCONTRIBUTIONS")
    public class CashContribution extends Booking {
      ...
    }
    

    在这之前,一切都很好。但是添加以下类时,模式生成失败。

    现金检索.java

    @EqualsAndHashCode(callSuper = true)
    @NoArgsConstructor
    @Entity
    @Table(name = "CASHRETRIEVALS")
    public class CashRetrieval extends Booking {
      ...
    }
    

    注:本项目大量利用 lombok 在编译时生成代码的注释。

    有人能帮我解决这个问题吗?


    编辑1:全堆栈跟踪

    Exception in thread "main" Local Exception Stack: 
    Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
    Exception Description: An exception was thrown while searching for persistence archives with 
    ClassLoader: sun.misc.Launcher$AppClassLoader@18b4aac2
    Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.EntityManagerSetupException
    Exception Description: Predeployment of PersistenceUnit [JPA] failed.
    Internal Exception: java.lang.NullPointerException
      at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:127)
      at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:115)
      at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:188)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
      at com.gipa.kassenbuch.Main.<init>(Main.java:16)
      at com.gipa.kassenbuch.Main.main(Main.java:26)
    Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.EntityManagerSetupException
    Exception Description: Predeployment of PersistenceUnit [JPA] failed.
    Internal Exception: java.lang.NullPointerException
      at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:2080)
      at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:2071)
      at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:101)
      at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:104)
      ... 5 more
    Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.EntityManagerSetupException
    Exception Description: Predeployment of PersistenceUnit [JPA] failed.
    Internal Exception: java.lang.NullPointerException
      at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:231)
      ... 9 more
    Caused by: java.lang.NullPointerException
      at org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.setPKClass(MetadataDescriptor.java:1846)
      at org.eclipse.persistence.internal.jpa.metadata.inheritance.InheritanceMetadata.process(InheritanceMetadata.java:244)
      at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processTableAndInheritance(EntityAccessor.java:1390)
      at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.process(EntityAccessor.java:683)
      at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage2(MetadataProject.java:1876)
      at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:575)
      at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:610)
      at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1992)
      ... 7 more
    

    主类

    public class Main {
    
      private final EntityManager manager;
    
      public Main () {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
        manager = factory.createEntityManager();
      }
    
      public void run() {
        final DatabaseProvider provider = DatabaseProvider.getInstance();
      }
    
      public static void main(String[] args) {
        new Main().run();
      }
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Chris    6 年前

    堆栈跟踪显示它在继承根实体中找不到IDClass。这似乎是MappedSuperClass分析中的一个错误,可以通过将 @IdClass(DatabaseId.class)