我正在尝试使用JPA注释在Hibernate中使用JOINED继承策略。 My Base类是抽象的,与其他实体具有多对一关联。但是我得到了Hibernate Exception:无法实例化抽象类或接口。 以下是我的班级结构:
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类成为抽象。有没有办法实现这个目标?
答案 0 :(得分:0)
如果您希望允许 SavingsAccount 或子女的SavingsAccount ,您可以在分支实体中尝试以下语法:
{% block body %}
{% if movies|length == 0 %}
There are no movie items available. Add a movie <a href="{{ path('movie_create_form') }}">here</a> to get started.
{% elseif movies|length != 0 %}
These are the results: <br />
<ul>
{% for x in movies %}
<li>Title: {{ x.title }} - Price: {{ x.price }} - <a href="{{ path('movie_edit', {id: x.id}) }}">Edit</a> - <a href="{{ path('movie_details', { id: x.id }) }}">Details</a> - <a href="{{ path('movie_delete', {id: x.id}) }}"> Delete</a></li>
{% endfor %}
</ul>
<a href="{{ path('movie_create_form') }}">Add more movie entries</a>
{% endif %}
{% endblock %}
如果您想要添加所有未来的帐户子对象,那么
@Cascade(value=org.hibernate.annotations.CascadeType.ALL)
private Set<? extends Account> accounts = new HashSet<SavingsAccount>();
答案 1 :(得分:0)
您应该将Account
课程设为MappedSuperclass
而不是Entity
。我没有尝试过,所以请告诉我,但这就是你如何处理带有JPA注释的抽象类。