2016-07-05 2 views
0
나는 주어진 사용자를 삭제하는 방법을 구현하려는

, 나는 이렇게 많은 다른 방법을 시도했지만 여전히 약간의 오차가 발생, 여기 내 클래스는 다음과 같습니다최대 절전 모드 삭제 사용자

@Entity 
    @Table(name = "roles", catalog = "demo", uniqueConstraints = @UniqueConstraint(columnNames = { "name" })) 
    public class Role { 

     private String name; 

     public Role() { 
     } 

     public Role(final String name) { 
      this.name = name; 
     } 

     @Id 
     @Column(name = "name", nullable = false, length = 50) 
     public String getRole() { 
      return this.name; 
     } 

     public void setRole(final String name) { 
      this.name = name; 
     } 

    } 

@Entity 
@Table(name="users", catalog="demo") 
public class User { 

    private String username; 
    private String password; 
    private boolean enabled; 
    private Set<Role> roles; 

    @Id 
    @Column(unique=true, nullable=false) 
    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @Column(nullable=false) 
    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Column(nullable=false) 
    public boolean isEnabled(){ 
     return enabled; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="user_role", catalog="demo", 
       joinColumns = @JoinColumn(name = "user_id"), 
       inverseJoinColumns = @JoinColumn(name = "role_id")) 
    public Set<Role> getRoles() { 
     return roles; 
    } 

    public void setRoles(Set<Role> roles) { 
     this.roles = roles; 
    } 

} 

내 방법은 내가 그렇게 쓴 지금까지 :

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FK_AUTHORITY_ROLE]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:163) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:730) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:592) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) 
    at org.springframework.test.context.transaction.TransactionContext.endTransaction(TransactionContext.java:128) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:224) 
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:313) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:94) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630) 
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584) 
    ... 25 more 
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no action; FK_AUTHORITY_ROLE table: USER_ROLE 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) 
    ... 38 more 
Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no action; FK_AUTHORITY_ROLE table: USER_ROLE 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.StatementDML.performReferentialActions(Unknown Source) 
    at org.hsqldb.StatementDML.delete(Unknown Source) 
    at org.hsqldb.StatementDML.executeDeleteStatement(Unknown Source) 
    at org.hsqldb.StatementDML.getResult(Unknown Source) 
    at org.hsqldb.StatementDMQL.execute(Unknown Source) 
    at org.hsqldb.Session.executeCompiledStatement(Unknown Source) 
    at org.hsqldb.Session.execute(Unknown Source) 
    ... 41 more 
+0

사용자를 두 번 얻는 이유는 무엇입니까? username을 사용하고 이미 검색된 사용자의 ID를 사용하여 한 번? '@ OneToMany'의'orphanRemoval' 속성을'true'로 설정하십시오. –

+0

@ M.Deinum 내가 시도했지만 여전히 같은 오류가 발생했습니다 : // – imoteb

+0

삭제하기 전에 역할을 가져옵니다. –

답변

1

user_role 테이블은 사용자와 역할 사이에 있으며 엔터티가 없습니다.

당신은 CascadeType.ALL을 사용하고 있지만 hibernate는 @JoinTable과 함께 사용될 때 주석을 무시합니다. CascadeType은 다른 엔티티와 만 작동하지만 데이터베이스 테이블을 직접 참조하지는 않습니다.

자세한 내용은 여기를 참조하십시오 : JPA CascadeType.REMOVE not working

엔티티를 생성하고 대신 관절 식의 사용자에 매핑하거나 사용자를 제거하기 전에 USER_ROLE 테이블에서 사용자 역할 매핑을 삭제합니다.

또 다른 좋은 옵션은 데이터베이스에서 user_role 조인 테이블에 대한 casade 삭제를 정의하는 것입니다.

0

정말 싶지 않아 :

@Override 
    public boolean deleteUser(final String username, String password){ 
     User user = findByUserName(username); 
     if(user != null){ 
      Serializable id = new String(username); 
      Object persistentInstance = sessionFactory.getCurrentSession().get(User.class, id); 
      if (persistentInstance != null) { 
       sessionFactory.getCurrentSession().delete(persistentInstance); 
      } 
      return true; 
     }else{ 
     return false; 
     } 
    } 

그리고 여기가 내가 가진 예외입니다 최대 절전 모드 설정을 보여 주기만하면되지만 간단한 삭제 작업을 위해 많은 코드를 작성하고 있음을 알 수 있습니다. findUserByName() 메서드가 제대로 작동하고 유효한 사용자를 반환하면이 사용자가 데이터베이스에서 해당 사용자를 삭제하기에 충분할 것입니다. 항상 그렇게합니다.

sessionFactory.getCurrentSession().delete(user); 

는 "사용자가"당신의 findUserByName (이름) 메서드를 호출하여 취득 된 객체이며,이 이미 SessionFactory에의 인스턴스가 있다고 가정합니다.

업데이트 스택 트레이스를 살펴 보지 않았습니다. 사용자가 다른 테이블에서 외부 키로 참조 된 것처럼 보이며이 경우 해당 필드를 참조하는 모든 필드를 삭제하지 않으면 해당 사용자를 삭제할 수 없습니다. 당신이 역할 role1이있는 사용자 1을 deleteting 때 때문에

+0

나는이 문제에 대한 해답을 어떻게 알지는 못한다. – Zulfi

+0

나는이 문제를 해결하기 위해 노력했다 :/ – imoteb

+0

@Zulfi 이것은 주석에 들어 있어야했다. 그러나 당신이 내 대리인을 보면 당신은 내가 다른 사람의 게시물에 대해 논평하기에 충분하지 않다는 것을 알게 될 것입니다. 그냥 도와 주려고. – ivange94

0

당신은 role1을 가지고 anothe 사용자가 아마도이 오류를 얻고있다.

getRolescascade=CascadeType.ALL이 있기 때문에 이러한 현상이 발생합니다. 그 폭포를 제거하고 그 폭포가 작동하는지보십시오.

+0

방금 ​​시도, 작동하지 : // – imoteb

+0

스택이 동일합니까? – KuroObi

+0

예, 그 동일 – imoteb