У Вас нигде не определена стратегия генерации первичных ключей, ни на уровне СУБД, ни на уровне вашей бизнес-логики. Для генерации ID могу порекомендовать использовать имеющиеся в MySQL средства. Для этого определите поле первичного ключа в БД как:
ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT
а в маппингах сущностей укажите следующее:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected Long id;
При таком подходе значение первичного ключа создаётся непосредственно в момент вставки записи в таблицу. При выполнении команды INSERT значение поля ID не указывается, а MySQL сам подставит значение, применив для его генерации сиквенс (специфический объект СУБД, последовательно генерирующий числа, обычно начиная с 1).
Настоятельно не рекомендую использовать примитивы для определения ID в сущности (private int id в Note), т.к. при создании нового экземпляра класса будет присвоено значение по умолчанию 0, что приводит к заблуждению - первичный ключ еще не генерировался, но у него уже есть какое-то значение.
Обычно, класс сущности, описывающий идентификатор, выносится в родительский класс, а все сущности проекта наследуются от него, за счёт чего возникает возможность не описывать поле ID повторно во всех наследниках, избавляясь от дублирования кода. Но, сначала добейтесь работоспособности текущей структуры, а затем занимайтесь рефакторингом иерархии классов. Вот пример определения родительского класса:
import javax.persistence.*;
import java.io.Serializable;
@MappedSuperclass
public abstract class Identifier implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Identifier that = (Identifier) o;
if (getId() != null) {
return getId().equals(that.getId());
} else {
return super.equals(o);
}
}
public int hashCode() {
return getId() != null ? getId().hashCode() : super.hashCode();
}
}
UPD
Маппинги сущностей БД обычно определяются с помощью аннотаций JPA, следующим образом:
import javax.persistence.*;
@Entity()
@Table(name = "note")
public class Note extends Identifier {
//fields, getters, setters
}