'Hibernate - IllegalArgumentException occurred calling getter of

I have a super simple app (just a first try with Hibernate) with this schema:

DROP DATABASE IF EXISTS deubor;
CREATE DATABASE IF NOT EXISTS deubor DEFAULT CHARACTER SET = utf8;
USE deubor;
SET character_set_client = utf8;

CREATE TABLE INSTRUMENT (
  ID INTEGER NOT NULL AUTO_INCREMENT,

  ISIN VARCHAR(12) DEFAULT '' NOT NULL,
  ISSUERNAME VARCHAR(200) DEFAULT '' NOT NULL,
  APPTYPE VARCHAR(20) DEFAULT '' NOT NULL,
  INSTYPE VARCHAR(20) DEFAULT '' NOT NULL,
  MDATE INTEGER DEFAULT '0' , 

  PRIMARY KEY(ID)
);

I've generated the Hibernate Entity and it produces the following:

    @Entity
@Table(name = "instrument")
public class Instrument {
    private int id;
    private String isin;
    private String issuername;
    private String apptype;
    private String instype;
    private Integer mdate;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return id;
    }

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

    @Basic
    @Column(name = "ISIN")
    public String getIsin() {
        return isin;
    }

    public void setIsin(String isin) {
        this.isin = isin;
    }

    @Basic
    @Column(name = "ISSUERNAME")
    public String getIssuername() {
        return issuername;
    }

    public void setIssuername(String issuername) {
        this.issuername = issuername;
    }

    @Column(name = "APPTYPE")
    public String getApptype() {
        return apptype;
    }

    public void setApptype(String apptype) {
        this.apptype = apptype;
    }

    @Basic
    @Column(name = "INSTYPE")
    public String getInstype() {
        return instype;
    }

    public void setInstype(String instype) {
        this.instype = instype;
    }

    @Basic
    @Column(name = "MDATE")
    public Integer getMdate() {
        return mdate;
    }

    public void setMdate(Integer mdate) {
        this.mdate = mdate;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Instrument that = (Instrument) o;
        return id == that.id &&
                Objects.equals(isin, that.isin) &&
                Objects.equals(issuername, that.issuername) &&
                Objects.equals(apptype, that.apptype) &&
                Objects.equals(instype, that.instype) &&
                Objects.equals(mdate, that.mdate);
    }

    public Instrument(String isin, String issuername, String apptype, String instype, Integer mdate) {
        this.isin = isin;
        this.issuername = issuername;
        this.apptype = apptype;
        this.instype = instype;
        this.mdate = mdate;
    }


    @Override
    public int hashCode() {
        return Objects.hash(id, isin, issuername, apptype, instype, mdate);
    }
}

hibernate.cfg.xml :

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/demo</property>
        <property name="connection.username">username</property>
        <property name="connection.password">password</property>
        <property name="show_sql">true</property>

        <mapping class="com.mm.prep.demo.model.Instrument" />

    </session-factory>
</hibernate-configuration>

Calling code with initialised object:

    @GetMapping("/")
    public String home(Model model) {
        InstrumentManager im = new InstrumentManager();
        Instrument i = new Instrument("XCVBFT", "Issuer 1", "INCLUSION", "BOND", null);
        im.setup();
        im.save(i);
        return "instruments";
    }

Code called in InstrumentManager:

    public void setup() {
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure() // configures settings from hibernate.cfg.xml
                .build();
        try {
            sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        } catch (Exception ex) {
            StandardServiceRegistryBuilder.destroy(registry);
        }
    }

    public void save(Instrument i) {
        Session s = sessionFactory.openSession();
        s.beginTransaction();
        s.save(i);
        s.getTransaction().commit();
        s.close();

    }

But when I try to save I get the following stacktrace. I mean this app can't get any simpler... what am I doing wrong?

IllegalArgumentException occurred calling getter of com.mm.prep.demo.model.Instrument.apptype
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.mm.prep.demo.model.Instrument.apptype
    at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:64)
    at org.hibernate.property.access.spi.GetterMethodImpl.getForInsert(GetterMethodImpl.java:76)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValuesToInsert(AbstractEntityTuplizer.java:619)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.getPropertyValuesToInsert(PojoEntityTuplizer.java:225)
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValuesToInsert(AbstractEntityPersister.java:4793)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:254)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source