【发布时间】:2014-05-22 21:18:03
【问题描述】:
在我的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;
}
}
【问题讨论】: