I have a few classes that we are attempting to extend to allow reuse of code, but hibernate is having none of it. Here are the new classes and their extensions:
Super statement class
@MappedSuperclass
public abstract class CoreStatement<S extends Approval>
implements java.io.Serializable
{
public abstract Long getId();
public abstract void setId(Long id);
public abstract Set<S> getApprovals();
public abstract void setApprovals(Set<S> approvals);
}
Base statement class - This does get extended later on, but via a single table inheritance
@Entity
@Table(name="EXPNS_STTMNT")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="CLASS_ID",
discriminatorType = DiscriminatorType.INTEGER
)
public abstract class ExpenseStatement extends CoreStatement<ExpenseApproval>
{
private Set<ExpenseApproval> approvals;
@Override
@Id
@Column(name="ID", unique=true, nullable=false, precision=10, scale=0)
public Long getId() {
return this.id;
}
@Override
public void setId(Long id) {
this.id = id;
}
@Override
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="statement",
targetEntity = ExpenseApproval.class)
public Set<ExpenseApproval> getApprovals() {
return approvals;
}
public void setApprovals(Set<ExpenseApproval> approvals) {
this.approvals = approvals;
}
}
Approval super class
@MappedSuperclass
public abstract class Approval<T extends CoreStatement> implements java.io.Serializable {
public abstract Long getId();
public abstract void setId(Long id);
public abstract T getStatement();
public abstract void setStatement(T statement);
}
Approval base class
@Entity
@Table(name="APPRVL")
public class ExpenseApproval extends Approval<ExpenseStatement>{
private Long id;
private ExpenseStatement statement;
@Id
@Column(name="ID", unique=true, nullable=false, precision=10, scale=0)
public Long getId() {
return this.id;
}
@Override
public void setId(Long id) {
this.id = id;
}
@Override
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="EXPENSE_STATEMENT_ID", nullable=true)
public ExpenseStatement getStatement() {
return statement;
}
@Override
public void setStatement(ExpenseStatement statement) {
this.statement= statement;
}
}
When running through the UnitTests, we get the error:
java.lang.ExceptionInInitializerError Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: EXPNS_STTMNT, for columns: [org.hibernate.mapping.Column(approvals)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:314) at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292) ....
It appears to be a mapping error of some kind, but I can't narrow it down. Many people who have posted the issue before had the problem where their Annotations were located above the private property and also getters i.e. They mixed and matched their annotation placement, but this doesn't appear to be the case here. Does anyone else have any suggestions on what could be causing the issue?