0

JPA アノテーションを使用して、Hibernate で JOINED 継承戦略を使用しようとしています。私の基本クラスは抽象的で、他のエンティティとの多対一の関連付けがあります。ただし、Hibernate Exception: Cannot instantiate a abstract class or interface が発生します。以下は私のクラス構造です:

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)

私のコードの何が問題なのかを理解するのを手伝ってください。抽象キーワードを削除すると正常に機能しますが、Account クラスを抽象化したいと考えています。これを達成する方法はありますか?

4

2 に答える 2

0

SavingsAccountまたはSavingsAccountの子を 許可する場合は、 Branch Entityで次の構文を試すことができます。

 @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>();
于 2016-02-26T08:41:28.120 に答える
0

Accountクラスを のMappedSuperclass代わりに にする必要がありEntityます。私はそれを試していないので、教えてください。それが、JPA アノテーションを使用して抽象クラスを処理する方法です。

参照: Java EE 6 チュートリアル : エンティティの継承

于 2016-02-26T15:05:40.647 に答える