JPA 2删除childs异常

时间:2014-06-01 12:50:38

标签: java mysql hibernate jpa-2.0

我遇到了JPA 2(Hibernate)+ MySQL的问题。我想删除root实体和子元素。这种关系是多对多的,并在中间表中包含其他字段。

当我执行delete调用方法" entityManager.remove(entity)"抛出异常。

请帮忙。

堆栈跟踪

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`bd_gestionproyectos`.`proyectos_recursos`, CONSTRAINT `FK_proyectos` FOREIGN KEY (`proyecto_id`) REFERENCES `proyectos` (`ID_proyecto`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2334)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186)

Proyecto.java

@Entity
@Table(name = "proyectos")
public class Proyecto implements BaseEntidad<Long> {
   ...
@OneToMany(mappedBy = "proyecto", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ProyectoRecurso> recursos;

Recurso.java

@Entity
@Table(name = "recursos")
public class Recurso implements BaseEntidad<Long> {
   ...
@OneToMany(mappedBy = "recurso", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ProyectoRecurso> proyectos;

ProyectoRecurso.java

@Entity
@Table(name = "proyectos_recursos")
public class ProyectoRecurso implements Serializable {

@EmbeddedId
private ProyectoRecursoId id;

@ManyToOne  
@JoinColumn(name = "proyecto_id", insertable = false, updatable = false)
private Proyecto proyecto;

@ManyToOne
@JoinColumn(name = "recurso_id", insertable = false, updatable = false)
private Recurso recurso;

@Column
private Double disponibilidad;

ProyectoRecursoId.java

@Column(name = "proyecto_id")
private Long proyectoId;
@Column(name = "recurso_id")
private Long recursoId;

删除Proyecto类型实体的逻辑代码

@Transactional(readOnly = false)
public void eliminar(final Long id) {
   final Proyecto aux = getEntityManager().find(Proyecto.class, id);
   if (aux != null) {
      getEntityManager().remove(aux);
   }
}

0 个答案:

没有答案