Java 尝试在数据库中持久化实体时主键出现问题

Java 尝试在数据库中持久化实体时主键出现问题,java,spring,hibernate,Java,Spring,Hibernate,在我的spring项目中,使用Hibernate来处理访问数据库的所有操作,我让系统在数据库中创建表,并在其中插入一些默认值 实体类的一个示例(用作创建表的基础)是: @Entity @Table(name="permission") public class Permissao { @Id @Column(name = "id") @GeneratedValue(strategy=GenerationType.AUTO) private int id;

在我的spring项目中,使用Hibernate来处理访问数据库的所有操作,我让系统在数据库中创建表,并在其中插入一些默认值

实体类的一个示例(用作创建表的基础)是:

@Entity
@Table(name="permission")
public class Permissao {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="nome")
    private String nome;

    public int getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

}
我的问题是,当我试图通过Java代码在已经插入值的表中插入一行时,会收到一条消息,说明主键已经存在

我猜这是因为Hibernate中的计数器没有用数据库中的计数器更新,但我不太清楚这些东西是如何工作的

任何人都能知道发生了什么以及如何解决这个问题

更新

这就是我在数据库中插入此实体的位置:

public boolean cadastra(HttpServletRequest request, HttpServletResponse response) {
    String nome_grupo = request.getParameter("nome");
    String[] permissoes = request.getParameterValues("permissoes[]");

    if(nome_grupo == null || permissoes == null)
        return false;

    System.out.println("criando grupo");
    GrupoPermissao grupo = new GrupoPermissao();
    grupo.setNome(nome_grupo);

    System.out.println("adicionando permissoes");
    List<Permissao> lista = new ArrayList<Permissao>();
    for(int i=0; i<permissoes.length; i++)
        lista.add(permissao.findById(Integer.valueOf(permissoes[i]).intValue()));
    grupo.setPermissao(lista);

    System.out.println("salvando no banco de dados");
    boolean result = grupo_permissao.persist(grupo);
    System.out.println("id_grupo = "+grupo.getId());
    return result;
}
这就是上面使用的实体GrupoPermissao:

@Entity
@Table(name="role")
public class GrupoPermissao {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="nome")
    private String nome;

    @ManyToMany
    @JoinTable(name="role_permissions", joinColumns={@JoinColumn(name="fk_role")}, inverseJoinColumns={@JoinColumn(name="fk_permission")})
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Permissao> permissao = new ArrayList<Permissao>();

    public int getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<Permissao> getPermissao() {
        return permissao;
    }

    public void setPermissao(List<Permissao> permissao) {
        this.permissao = permissao;
    }

}

在创建对象权限时,可以插入id属性。这不是必需的。

这里的问题可能是您将id声明为原语而不是包装器

因此,不是:

private int id;
你应该:

private Integer id;
使用以下内容创建组时:

GrupoPermissao grupo = new GrupoPermissao();
id为0,与NULL不同

因此,两个调用此方法的请求将尝试设置id为0的组,因此会发生冲突

只有当id为NULL时,自动生成策略才会让数据库设置id


Hibernate不使用自动策略存储任何id计数器,而是将此职责委托给数据库。

好的,我终于解决了这个问题。问题是用于填充数据库的文件正在使用带有主键指示的INSERT。我删除了这个引用,让hibernate来处理这个问题,现在一切都正常了。

我更新了我的问题,将插入的代码包括在内。我想,我没有在任何地方插入id atribute。我更新代码,将id更改为整数,但仍然存在同样的问题,该实体不是用0初始化的,而是用一系列数字中的最后一个数字-在最后一个数字为9的时刻-匹配我通过程序插入的元素数,因为我认为Hibernate有你自己的计数器。还有一件事,你在GrupoPermissao上调用persist,但它没有任何级联到私有列表的权限。