gpt4 book ai didi

java - Hibernate Inheritance.TABLE_PER_CLASS 策略

转载 作者:行者123 更新时间:2023-12-01 04:33:36 27 4
gpt4 key购买 nike

我在 hibernate 方面遇到了一个非常大的问题。

我的继承策略在 eclipselink 作为 jpa 提供程序下完美运行,无论是在 glassfish 还是 jboss 应用程序服务器下,但是当我切换到 hibernate 时,一切都变得困惑。

我在这里阅读了几篇文章,但没有一个能解决我的问题。

以下是堆栈跟踪。

Failed to start service
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_21]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_21]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_21]
Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass
at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:210)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:201)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2011)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:765)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:684)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3406)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3360)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1334)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:162)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
... 3 more

我已确保没有子类定义另一个 @Id 列(在任何情况下,netbeans 总是会为我标记此错误)

这是我拥有的一组继承:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@PartialSecurity
public abstract class DataVerification extends SecureEntity implements Serializable {

private static final long serialVersionUID = IdGenerator.serialVersionUID(DataVerification.class);
@Id
private Long verificationId = IdGenerator.generateId();
@Column(length = 50, nullable = false)
private String verificationCode;
private String verifiedId;
private boolean verified;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Calendar verificationDate;
private DataVerificationType dataVerificationType;
private VerificationMethod verificationMethod;
@OneToOne
private Account verifiedBy;
@OneToOne
private Account approvedBy;


/**
*
* @author marembo
*/
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class OnlineDataVerification extends DataVerification implements Serializable {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Ignore
private List<UploadFile> verificationFiles;


/**
*
* @author marembo
*/
@Entity
public class IncomeDataVerification extends OnlineDataVerification implements Serializable {

private static final long serialVersionUID = IdGenerator.serialVersionUID(IncomeDataVerification.class);
private IncomeSource incomeSource;
private String occupation;


/**
*
* @author marembo
*/
@Entity
public class AgentDataVerification extends OnlineDataVerification implements Serializable {

@Column(length = 2048, nullable = false)
private String comment;
private String verificationTransaction = IdGenerator.generateStringId();

谢谢

最佳答案

您的堆栈跟踪引起了对 hibernate 版本不一致问题的怀疑。如果您将应用程序部署到 JBoss,JBoss 已经有自己的 hibernate 状态。如果你的war也带有不同版本的Hibernate,则类路径上加载的实际类可能不一致,从而导致各种问题。

通常最佳实践是,如果您要部署到已经提供 hibernate 的容器,请不要将其捆绑在您的 war 中(例如:标记 maven pom 上提供的依赖项)

关于java - Hibernate Inheritance.TABLE_PER_CLASS 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com