Richard
Richard

Reputation: 8935

Hibernate error: hibernate.MappingException when doing a OneToMany join

I am getting the following hibernate error, if anyone can help me resolve it, I would appreciate the help.

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: Lob, for columns: [org.hibernate.mapping.Column(approvers)]

There is a problem with the way I join the two tables:

@OneToMany(cascade = CascadeType.ALL, targetEntity = AutoApprovalApproverConfiguration.class, mappedBy = "lobid", fetch = FetchType.EAGER)
private List<AutoApprovalApproverConfiguration> approvers;

More info:

Database:

CREATE TABLE public.lob
(
    lobid bigint NOT NULL,
    name character varying(150) COLLATE pg_catalog."default",
    description character varying(250) COLLATE pg_catalog."default",
    departmentid bigint,
    companyid bigint NOT NULL,
    datedisabled character varying(255) COLLATE pg_catalog."default",
    disabled boolean,
    lastupdated timestamp without time zone,
    CONSTRAINT cc1178706309176 PRIMARY KEY (lobid),
    CONSTRAINT fk12b1f66ea598 FOREIGN KEY (companyid)
        REFERENCES public.merchants (merchant_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

and

CREATE TABLE public.autoapprovalapproverconfig
(
    id bigint NOT NULL,
    approverid bigint,
    linemanagerid bigint,
    lobid bigint,
    mandatelevelamount numeric(20,2),
    CONSTRAINT autoapprovalapproverconfig_pkey PRIMARY KEY (id),
    CONSTRAINT fkc33597b970049bf4 FOREIGN KEY (linemanagerid)
        REFERENCES public.person (personid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fkc33597b99cc58a80 FOREIGN KEY (approverid)
        REFERENCES public.person (personid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

Entities:

Lob.java

public class Lob implements Serializable
{
    @Id
    @SequenceGenerator(allocationSize = 1, name = "lob_sequence", sequenceName = "lob_ids")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "lob_sequence")
    private Integer lobid;
    @OneToMany(cascade = CascadeType.ALL, targetEntity = AutoApprovalApproverConfiguration.class, mappedBy = "lobid", fetch = FetchType.EAGER)
    //@OrderBy("mandateLevelAmount")
    private List<AutoApprovalApproverConfiguration> approvers;

AutoApprovalApproverConfiguration.java

public class AutoApprovalApproverConfiguration implements Serializable
{

    private static final long serialVersionUID = 1604255007323958024L;

    @Id
    @SequenceGenerator(allocationSize = 1, name = "seq_autoapprovalapproverconfig_id", sequenceName = "seq_autoapprovalapproverconfig_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq_autoapprovalapproverconfig_id")
    private Long id;
    private Integer lobid;
    private BigDecimal mandateLevelAmount;

I am using Java 7 and Hibernate 1.2.0.Final

UPDATDE:

I change to:

@OneToMany(cascade = CascadeType.ALL, targetEntity = AutoApprovalApproverConfiguration.class, mappedBy = "lob", fetch = FetchType.EAGER)
//@OrderBy("mandateLevelAmount")
private List<AutoApprovalApproverConfiguration> approvers;

and

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "lobid")
private Lob lob;

But now I get:

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: Lob, for columns: [org.hibernate.mapping.Column(approvers)]

Upvotes: 0

Views: 83

Answers (2)

Richard
Richard

Reputation: 8935

I fixed this by having the JPA annotations consistent, i.e. all above the getters, and not some above the member variables. Also, I hanged from a List to a Set.

@OneToMany(cascade = CascadeType.ALL, targetEntity = AutoApprovalApproverConfiguration.class, mappedBy = "lob", fetch = FetchType.EAGER)
@OrderBy("mandateLevelAmount")
public Set<AutoApprovalApproverConfiguration> getApprovers() {
    return approvers;
}

and

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "lobid")
private Lob lob;

Upvotes: 0

Timon S
Timon S

Reputation: 26

I am not sure but I think you have to map in both classes this way, ManyToOne in Lob Configuration class and ManyToOne in Lob class

@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
        @JoinColumn(name = "lobid")
        private Integer lobid;

     @OneToMany(cascade = CascadeType.ALL, targetEntity = AutoApprovalApproverConfiguration.class, mappedBy = "lobid", fetch = FetchType.EAGER)
        //@OrderBy("mandateLevelAmount")
        private List<AutoApprovalApproverConfiguration> approvers;

Upvotes: 0

Related Questions