2017-03-20 11 views
0

私のSpring Boot Webアプリケーションでは、データベースからエンティティを削除するためのメソッドを提供するコントローラがあります。このメソッドは、DAOクラスを呼び出します。私はentityManager.remove(entity)を呼び出すときにしかし、私はentityがちょうどデータベースから取得し、entityを変えたかもしれない私のAPIへの他の呼び出しがなかったたにもかかわらず、StaleObjectStateExceptionを受けます。エンティティを削除するときにStaleObjectStateExceptionが発生するのはなぜですか?

これは私のコントローラである:

@Transactional 
@RestController 
public class AppAdminController { 
    ... 
    @RequestMapping(value = "/admins/{username}", method = RequestMethod.DELETE) 
    public void deleteAdmin(@PathVariable("username") String username) { 
     dao.removeByUsername(username); 
    } 
} 

DAO:

@Service 
public class AppAdminDao extends AbstractDAO<UUID, AppAdmin> { 

    public AppAdmin getByUsername(String username) { 
     TypedQuery<AppAdmin> query = em.createQuery("SELECT a FROM AppAdmin a WHERE a.username=:username", AppAdmin.class); 
     query.setParameter("username", username); 

     try { 
      return query.getSingleResult(); 
     } catch (NoResultException e) { 
      return null; 
     } 
    } 

    public void removeByUsername(String username) { 
     AppAdmin admin = getByUsername(username); 
     if(admin != null) { 
       em.remove(admin); 
     } 
    } 
} 

AppAdmin aa

AppAdmin res = em.merge(aa); 

とさえエンティティを追加すると、例外を生成した直後em.remove(res)を呼び出すことを呼び出すことによって追加されます上記の通り。私は間違って何をしていますか?

+0

それはあなたの保存されていない値のマッピングは、エンティティのために欠落していることだろうか? によって、Spring Data JPAを使用してみませんか?あなたのDaoはこれまで圧縮できます: public interface ChainLevelRepository extends JpaRepository {} – PaulNUK

+1

保存されていない値のマッピングを追加するにはどうすればいいですか?私はSpring Data JPAを見ていきます – user2035039

答えて

1

PaulNUKのヒントに続いて、@Version注釈付きフィールドを私のエンティティに追加しました。今度はデータベースにエンティティを追加する際に次の例外が発生しました:org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

問題は、次のことが判明した:私のエンティティは次のように注釈されたIDとしてUUIDを有する:

@Id 
@GeneratedValue(generator = "uuid2") 
@GenericGenerator(name = "uuid2", strategy = "uuid2") 

@Column(columnDefinition = "BINARY(16)") 

を追加する問題を解決しました。

関連する問題