我有一个具有多个继承层的数据模型。只要每一层只包含一个类,我就可以生成数据库模式。当我将另一个类添加到最后一个层时,在尝试生成模式时会得到一个异常:
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();
}
}