2016-02-26 19 views
0

我想在使用JPA批注的Hibernate中使用JOINED继承策略。我的基类是抽象的,并与其他实体具有多对一关联。不过,我正在获取Hibernate异常:无法实例化抽象类或接口。 以下是我的阶级结构:Hibernate:获取org.hibernate.InstantiationException虽然在onetomany协会中获取多态集合

Account.java

@Entity(name="BANK_ACCOUNTS") 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Account { 

    @Id 
    @Column(name="ACC_ID") 
    @SequenceGenerator(name="account_id_seq", sequenceName="BANK_ACCOUNT_ACC_ID", allocationSize=1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="account_id_seq") 
    private Long id; 

    @Column(name="IS_ACTIVE") 
    @Type(type="yes_no") 
    private Boolean isActive; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="ACC_BRANCH_ID") 
    private Branch branch; 
} 

SavingsAccount.java

@Entity(name="BANK_SAVINGS_ACCOUNT") 
public class SavingsAccount extends Account{ 

    @Column(name="CURR_BAL") 
    private BigDecimal currentBalance; 
} 

Branch.class

@Entity(name="BANK_BRANCH") 
public class Branch { 

    @Id 
    @Column(name="BRANCH_ID") 
    @SequenceGenerator(name="branch_id_seq", sequenceName="BANK_BRANCH_BRANCH_ID", allocationSize=1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="branch_id_seq") 
    private Long id; 


    @OneToMany(mappedBy="branch",orphanRemoval=true, fetch= FetchType.LAZY) 
    @Cascade(value=org.hibernate.annotations.CascadeType.ALL) 
    private Set<Account> accounts = new HashSet<Account>(); 
} 

所以每当我试图让帐户列表使用下面的代码由分支持有我得到了异常提到贝洛女:

Branch branch = (Branch) session.get(Branch.class, branchId); 
SavingsAccount acc = new SavingsAccount(); 
acc.setBranch(branch); 
branch.getAccounts().add(acc); 

异常跟踪:

org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: : com.sapient.bank.entities.Account 
    at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:114) 
    at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:136) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:737) 
    at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:4761) 
    at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1427) 
    at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1415) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.hydrateEntityState(EntityReferenceInitializerImpl.java:235) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:107) 
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:129) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:138) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102) 
    at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:100) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:693) 
    at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:92) 
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1933) 
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:559) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:261) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:555) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:143) 
    at org.hibernate.collection.internal.AbstractPersistentCollection$3.doWork(AbstractPersistentCollection.java:336) 
    at org.hibernate.collection.internal.AbstractPersistentCollection$3.doWork(AbstractPersistentCollection.java:324) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:261) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.readElementExistence(AbstractPersistentCollection.java:323) 
    at org.hibernate.collection.internal.PersistentSet.add(PersistentSet.java:200) 
    at com.sapient.bank.dao.AccountDao.createNewSavingsAcc(AccountDao.java:28) 
    at com.sapient.util.MainClass.main(MainClass.java:32) 

请帮助我了解什么是错我的代码。它的工作很好,如果我删除抽象关键字,但我想要帐户类为抽象。有什么办法可以做到这一点?

+0

。 – Ankit

回答

0

你可以尝试在分公司实体以下语法,如果你想允许SavingsAccount儿童SavingsAccount的:

@Cascade(value=org.hibernate.annotations.CascadeType.ALL) 
private Set<? extends Account> accounts = new HashSet<SavingsAccount>(); 

如果你想添加的帐户未来所有子对象,然后

@Cascade(value=org.hibernate.annotations.CascadeType.ALL) 
    private Set<? extends Account> accounts = new HashSet<Account>(); 
+0

如果我这样做,那么我将无法与任何未来的帐户子类保持关联,例如:LoanAccounts。分行可以同时持有savingsAccount和loanAccount。 – Ankit

+0

上述配置是否修复了异常org.hibernate.InstantiationException:无法实例化抽象类或接口:: com.sapient.bank.entities.Account,你得到了什么? – CrawlingKid

0

您应该使Account类为MappedSuperclass而不是Entity。我没有尝试,所以让我知道,但这就是你如何使用JPA注释处理抽象类。

参考:客户,分公司,SavingsAccount:我有我的DB 3个表对应班里结构The Java EE 6 Tutorial : Entity Inheritance