Tenho um banco de dados que já possui dados, e estou criando uma aplicação com spring boot, e quando vou criar meu @Entity, o spring pede um @Id pra eu poder executar, porém quando vou salvar um novo valor no banco, ele da erro porque ele fala que a PK já existe, e realmente já existe, porém a minha duvida é a seguinte, é possivel eu criar um @Entity sem anotação @Id?
ou usar o @Id e deixar o banco de dados inserir esse id automaticamente?
Não é possível.
Qual o banco? Qual a estratégia para geração do Id que está usando? Como está o código?
estou usando postgres, ela e um auto increment apenas, quando eu insiro um valor no banco, insere um novo valor na coluna tambem. meu entity esta da seguinte forma:
package br.com.technicalAssistance.model;
import java.sql.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name=“tbl_estoque”)
public class Stock {
@Id
private int idEstoque;
@Column(name="id_produto")
private int idProduto;
@Column(name="nm_produto")
private String nmProduto;
@Column(name="dt_entrada_produto")
private Date dtEntradaProduto;
@Column(name="qtd_produto")
private int qtdProduto;
@Column(name="dc_produto")
private String descricaoProduto;
public Stock(int idEstoque, String nmProduto, Date dtEntradaProduto, int qtdProduto, String descricaoProduto,
int idProduto) {
this.idEstoque = idEstoque;
this.idProduto = idProduto;
this.nmProduto = nmProduto;
this.dtEntradaProduto = dtEntradaProduto;
this.qtdProduto = qtdProduto;
this.descricaoProduto = descricaoProduto;
}
public Stock(String nmProduto, Date dtEntradaProduto, int qtdProduto, String descricaoProduto) {
this.nmProduto = nmProduto;
this.dtEntradaProduto = dtEntradaProduto;
this.qtdProduto = qtdProduto;
this.descricaoProduto = descricaoProduto;
}
public Stock(String nmProduto, Date dtEntradaProduto, int qtdProduto, String descricaoProduto, int idProduto) {
this.idProduto = idProduto;
this.nmProduto = nmProduto;
this.dtEntradaProduto = dtEntradaProduto;
this.qtdProduto = qtdProduto;
this.descricaoProduto = descricaoProduto;
}
public Stock() {
}
public int getIdEstoque() {
return idEstoque;
}
public void setIdEstoque(int idEstoque) {
this.idEstoque = idEstoque;
}
public int getIdProduto() {
return idProduto;
}
public void setIdProduto(int idProduto) {
this.idProduto = idProduto;
}
public String getNmProduto() {
return nmProduto;
}
public void setNmProduto(String nmProduto) {
this.nmProduto = nmProduto;
}
public Date getDtEntradaProduto() {
return dtEntradaProduto;
}
public void setDtEntradaProduto(Date dtEntradaProduto) {
this.dtEntradaProduto = dtEntradaProduto;
}
public int getQtdProduto() {
return qtdProduto;
}
public void setQtdProduto(int qtdProduto) {
this.qtdProduto = qtdProduto;
}
public String getDescricaoProduto() {
return descricaoProduto;
}
public void setDescricaoProduto(String descricaoProduto) {
this.descricaoProduto = descricaoProduto;
}
}
Postgres, preferencialmente, usa sequence.
Você pode alterar a tua definição de Id para algo assim
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenceGeneratorForThisId")
@SequenceGenerator(name = "sequenceGeneratorForThisId", sequenceName = "SEQUENCE_FOR_THIS_TABLE", initialValue = 1, allocationSize = 1)
private Integer idEstoque; / Eu sempre prefiro Long e sempre prefiro objetos ao invés de primitivos.
O initialValue pode ser o último valor que você tem no banco e acrescentar 1, exemplo, se o maior id que você tem atualmente é 3045, você coloca initialValue = 3046
Dá uma pesquisada nisso, tem muito detalhe e não vai caber aqui.
vou dar uma olhada aqui, obrigado pela resposta