Hibernate and Java generics - unable to create factory session with MappedSuperClass

I have several classes that we are trying to extend to reuse code, but sleep mode has nothing. Here are the new classes and their extensions:

Super Operator 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);

}

The base operator class . This will expand later, but through one 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;
    }
}

Approve class super

@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);
}

Standard 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 starting UnitTests, we get an error:

java.lang.ExceptionInInitializerError : org.hibernate.MappingException: : java.util.Set, : EXPNS_STTMNT, : [org.hibernate.mapping.Column()] org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:314) org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292)     ....

, , . , , , , , .. , , , . - - , ?

+4
1

Hibernate , , , . , . , .

, :

@MappedSuperclass
public abstract class Approval<T extends CoreStatement> implements java.io.Serializable  {

    private Long id;
    private T statement


    @Id
    @Column(name="ID", unique=true, nullable=false)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="STATEMENT_ID", nullable=true)
    public T getStatement() {
        return statement;
    }

    public void setStatement(T statement) {
        this.statement = statement;
    }
}

, , @AssociationOverrides .

@Entity
@Table(name="APPRVL")
@AssociationOverrides({
    @AssociationOverride(name="statement", joinColumns = @JoinColumn(name = "EXPENSE_STATEMENT_ID"))
})    
public class ExpenseApproval extends Approval<ExpenseStatement>{
    private ExpenseStatement statement;

}
0

All Articles