Search code examples
javahibernaterestjerseyidentifier

SQL server identity ON but org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned beforeQuery calling save()


I'm building a rest web service in Java with json input hibernate for DB connection and for DB I'm using MS SQL Server as my database. Although my DB table ID column's is set on auto-increment, I'm experiencing this error ids for this class must be manually assigned beforeQuery calling save()

Following is my JSON request sample:

{
    "message": "Hi",
    "createdOn": "2020-04-29T19:39:14.589+05:30",
    "amount": "58.1"
}

My model class is like this, I've tried everything. The auto increment is on in my SQL Server table, what could be the problem?:

 import java.util.Date;

    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.xml.bind.annotation.XmlRootElement;


    @Entity
    @Table(name = "MessagesDetail")
    @XmlRootElement
    public class Message
    {
    @Id
    @Column(name = "msg_id",unique=true, nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long msg_id;
    @Column
    private String message;
    @Column
    private Date createdOn;
    @Column
    private Double amount;

    public Long getMsg_id()
    {
        return msg_id;
    }



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



    public String getMessage()
    {
        return message;
    }



    public void setMessage(String message)
    {
        this.message = message;
    }



    public Date getCreatedOn()
    {
        return createdOn;
    }



    public void setCreatedOn(Date createdOn)
    {
        this.createdOn = createdOn;
    }



    public Double getAmount()
    {
        return amount;
    }



    public void setAmount(Double amount)
    {
        this.amount = amount;
    }



    public Message()
    {
    }



    public Message(Long id, String message, Date createdOn, Double amount)
    {
        this.id = id;
        this.message = message;
        this.createdOn = createdOn;
        this.amount = amount;
    }


    }

Then I'm saving it using the following code:

public void addMessage(Message bean){
    Session session = SessionUtil.getSession();
    Transaction tx = session.beginTransaction();
    addMessage(session,bean);
    tx.commit();
    session.close();

}

private void addMessage(Session session, Message bean){
    Message message = new Message();

    message.setMessage(bean.getMessage());
    message.setCreatedOn(bean.getCreatedOn());
    message.setAmount(bean.getAmount());
    session.save(Message);
}

Solution

  • I changed the mapping of my id parameter class to identity instead of assigned and now it works perfectly. Refer the following change:

    Before:

    <class name="com.sample.rest.model.Message" table="MessagesDetail">  
    <id name="msg_id" type="java.lang.Integer">
    <column name="msg_id"></column>
     <generator class="assigned"></generator>  
    </id>  
    

    After:

    <class name="com.sample.rest.model.Message" table="MessagesDetail">  
    <id name="msg_id" type="java.lang.Integer">
    <column name="msg_id"></column>
     <generator class="identity"></generator>  
    </id>