我有两张桌子,当我尝试保存Usuarios Entity时,抛出
org.springframework.dao.DataIntegrityViolationException:无法添加或 更新子行:外键约束失败 (
formato_inscripcion
。roles_usuario
,CONSTRAINTroles_usuario_ibfk_1
外键(ID_USUARIO
,CLAVE_USUARIO
) 参考usuarios
(ID
,CLAVE
)); SQL [不适用];约束[null]; 嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法添加或 更新子行:外键约束失败 (formato_inscripcion
。roles_usuario
,CONSTRAINTroles_usuario_ibfk_1
外键(ID_USUARIO
,CLAVE_USUARIO
) 参考文献usuarios
(ID
,CLAVE
))at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:163) 在 org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:730) 在 org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:592) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) `CREATE TABLE ROLES( CLAVE VARCHAR(10)独特的主要钥匙, DESCRIPCION VARCHAR(50))ENGINE = INNODB;
CREATE TABLE USUARIOS( ID INT AUTO_INCREMENT, CLAVE CHAR(10) UNIQUE,
USUARIO VARCHAR(10),
PASSWORD VARCHAR(10) NOT NULL,
CLAVE_TIPO_USUARIO CHAR(10) NOT NULL,
PRIMARY KEY(ID,CLAVE),
FOREIGN KEY(CLAVE_TIPO_USUARIO) REFERENCES TIPO_USUARIO(CLAVE) )ENGINE=INNODB;
CREATE TABLE ROLES(
CLAVE VARCHAR(10) UNIQUE PRIMARY KEY,
DESCRIPCION VARCHAR(50)
)ENGINE=INNODB;
CREATE TABLE ROLES_USUARIO(
CLAVE_ROL VARCHAR(10) ,
ID_USUARIO INT ,
CLAVE_USUARIO CHAR(10) ,
FOREIGN KEY(ID_USUARIO,CLAVE_USUARIO) REFERENCES USUARIOS(ID,CLAVE),
FOREIGN KEY(CLAVE_ROL) REFERENCES ROLES(CLAVE)
)ENGINE=INNODB;
CREATE TABLE TIPO_USUARIO(
CLAVE CHAR(10) PRIMARY KEY,
NOMBRE VARCHAR(10) UNIQUE,
DESCRIPCION VARCHAR(10)
)ENGINE=INNODB;
我的JPA模型
@Embeddable
public class UsuariosId implements java.io.Serializable {
private int id;
private String clave;
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name = "ID" )
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "CLAVE", length = 10)
public String getClave() {
return this.clave;
}
public void setClave(String clave) {
this.clave = clave;
}
}
用户实体
@Entity
@Table(name = "USUARIOS", catalog = "", uniqueConstraints = @UniqueConstraint(columnNames = "CLAVE"))
public class Usuarios implements java.io.Serializable {
private UsuariosId id;
private Set<Roles> roles;
//private String claveTipoUsuario;
private List<Asigna> asigna;
public Usuarios() {
}
@EmbeddedId
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "ID")),
@AttributeOverride(name = "clave", column = @Column(name = "CLAVE", unique = true, length = 10)) })
public UsuariosId getId() {
return this.id;
}
public void setId(UsuariosId id) {
this.id = id;
}
@Column(name = "USUARIO", length = 10)
public String getUsuario() {
return this.usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
@Column(name = "PASSWORD", nullable = false, length = 10)
public String getPassword() {
return this.password;
}
@ManyToMany(targetEntity=Roles.class,
cascade=CascadeType.ALL)
@JoinTable(name="ROLES_USUARIO", joinColumns={@JoinColumn(name = "ID_USUARIO", referencedColumnName="ID"),
@JoinColumn(name="CLAVE_USUARIO",referencedColumnName="CLAVE")}
, inverseJoinColumns={@JoinColumn(name="CLAVE_ROL",referencedColumnName="CLAVE")})
public Set<Roles> getRoles() {
return roles;
}
public void setRoles(Set<Roles> roles) {
this.roles = roles;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="CLAVE_TIPO_USUARIO")
public TipoUsuario getClavetipousuario() {
return clavetipousuario;
}
public void setClavetipousuario(TipoUsuario clavetipousuario) {
this.clavetipousuario = clavetipousuario;
}
}
角色实体
@Entity
@Table(name = "ROLES", catalog = "", uniqueConstraints = @UniqueConstraint(columnNames = "CLAVE"))
public class Roles implements java.io.Serializable {
private String clave;
private String descripcion;
private Set<Usuarios> usuarios;
public Roles() {
}
public Roles(String clave, String descripcion) {
this.clave = clave;
this.descripcion = descripcion;
}
@Id
@Column(name = "CLAVE", unique = true, length = 30)
public String getClave() {
return this.clave;
}
public void setClave(String clave) {
this.clave = clave;
}
@Column(name = "DESCRIPCION", length = 50)
public String getDescripcion() {
return this.descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
//@MapsId("id")
@ManyToMany(mappedBy="roles")
public Set<Usuarios> getUsuarios() {
return usuarios;
}
public void setUsuarios(Set<Usuarios> usuarios) {
this.usuarios = usuarios;
}
}
@Entity
@Table(name = "TIPO_USUARIO", catalog = "", uniqueConstraints = @UniqueConstraint(columnNames = "NOMBRE"))
public class TipoUsuario implements java.io.Serializable {
private String clave;
private String nombre;
private String descripcion;
private List<Usuarios> usuarios;
public TipoUsuario() {
}
public TipoUsuario(String clave) {
this.clave = clave;
}
public TipoUsuario(String clave, String nombre, String descripcion) {
this.clave = clave;
this.nombre = nombre;
this.descripcion = descripcion;
}
@Id
@Column(name = "CLAVE", unique = true, nullable = false, length = 10)
public String getClave() {
return this.clave;
}
public void setClave(String clave) {
this.clave = clave;
}
@Column(name = "NOMBRE", unique = true, length = 10)
public String getNombre() {
return this.nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
@Column(name = "DESCRIPCION", length = 10)
public String getDescripcion() {
return this.descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
@OneToMany(mappedBy="clavetipousuario")
public List<Usuarios> getUsuarios() {
return usuarios;
}
public void setUsuarios(List<Usuarios> usuarios) {
this.usuarios = usuarios;
}
}
My TestClass
@Repository
public class UsuariosDaoTest extends TesteBase {
private static Logger logger = LoggerFactory.getLogger(UsuariosDaoTest.class);
Integer inicio;
String dato;
@Autowired
RolesDao rolesDao;
@Autowired
UsuariosDao usuariosdao;
@Autowired
TipoUsuarioDao tipousuariodao;
@Test
public void testdao(){
assertNotNull(usuariosdao);
}
@Test
public void testaddDao(){
Roles rol1 = (Roles) rolesDao.getRolByClave("rol003");
HashSet roles = new HashSet<Roles>();
roles.add(rol1);
Usuarios u = new Usuarios();
UsuariosId uid = new UsuariosId();
uid.setClave("54");
TipoUsuario tu = (TipoUsuario) tipousuariodao.getTipoUsuarioByClave("3");
u.setId(uid);
u.setClavetipousuario(tu);
Serializable b1 = usuariosdao.add(u);
u.setRoles(roles);
usuariosdao.update(u);
}
答案 0 :(得分:0)
你的桌子看起来不正确。或者您尚未在此处发布所有创建表脚本。
没有这样的TIPO_USUARIO
表。 USUARIOS
表也没有任何名为CLAVE_TIPO_USUARIO
的字段。