簡體   English   中英

Hibernate Inheritance.TABLE_PER_CLASS策略

[英]Hibernate Inheritance.TABLE_PER_CLASS strategy

我在休眠時遇到了一個非常大的問題。

我的繼承策略在eclipselink下可以很好地在glassfish和jboss應用服務器下作為jpa提供程序使用,但是當我切換到休眠狀態時,一切就都進行了。

我在這里閱讀了幾篇文章,但都沒有解決我的問題。

以下是堆棧跟蹤。

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();

謝謝

您的堆棧跟蹤引發了對休眠版本不一致問題的懷疑。 如果將應用程序部署到JBoss,則JBoss已經擁有自己的休眠模式。 如果您的戰爭還使用了不同版本的Hibernate,則加載在類路徑上的實際類可能不一致,從而導致各種問題。

通常,最佳實踐是,如果要部署到已經提供了休眠的容器,請不要將其捆綁在戰爭中(例如:將依賴項標記為maven pom所提供的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM