2014-03-27 26 views
13

我有一个春季4应用程序,我试图从我的数据库中删除一个实体的实例。我有以下实体:删除不使用JpaRepository

@Entity 
public class Token implements Serializable { 

    @Id 
    @SequenceGenerator(name = "seqToken", sequenceName = "SEQ_TOKEN", initialValue = 500, allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqToken") 
    @Column(name = "TOKEN_ID", nullable = false, precision = 19, scale = 0) 
    private Long id; 

    @NotNull 
    @Column(name = "VALUE", unique = true) 
    private String value; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "USER_ACCOUNT_ID", nullable = false) 
    private UserAccount userAccount; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "EXPIRES", length = 11) 
    private Date expires; 

    ... 
    // getters and setters omitted to keep it simple 
} 

我有一个JpaRepository接口定义:

public interface TokenRepository extends JpaRepository<Token, Long> { 

    Token findByValue(@Param("value") String value); 

} 

我有一个单元测试设置在存储器数据库(H2)与工作和我预填充带有两个令牌的数据库:

@Test 
public void testDeleteToken() { 
    assertThat(tokenRepository.findAll().size(), is(2)); 
    Token deleted = tokenRepository.findOne(1L); 
    tokenRepository.delete(deleted); 
    tokenRepository.flush(); 
    assertThat(tokenRepository.findAll().size(), is(1)); 
} 

第一个断言通过,第二个断言失败。我尝试了另一个测试,它改变了令牌值并将其保存到数据库中,并且确实可以工作,所以我不确定为什么delete不起作用。它不会抛出任何异常,只是不会将其保存到数据库中。它对我的oracle数据库也不起作用。


编辑

仍然有这个问题。我能加入这个我TokenRepository接口获取删除坚持到数据库:

@Modifying 
@Query("delete from Token t where t.id = ?1") 
void delete(Long entityId); 

然而,这不是一个理想的解决方案。任何想法,我需要做什么才能使它没有这种额外的方法工作?

回答

1

您的ID初始值是500。这意味着你的ID有500

@SequenceGenerator(name = "seqToken", sequenceName = "SEQ_TOKEN", 
initialValue = 500, allocationSize = 1) 

开始,并选择ID为1这里

Token deleted = tokenRepository.findOne(1L); 

一个项目,以便检查数据库,以澄清

+0

我不认为这是这里的问题,因为当我播种用测试数据测试,我指定ID为1 –

11

我有同样的问题

也许你的UserAccount实体有一个@OneToMany与Cascade的某些属性。

我刚刚删除的级联,不是删除时,它可能持续...

+0

这个工作对我来说也是如此。具体来说,我玩过并能够保留这些级联类型:[CascadeType.PERSIST,CascadeType.REFRESH],并仍然通过子存储库获取删除操作。对我来说没有任何意义的是,我通过父母的“mappedBy”将该所有者实体变为孩子 – GameSalutes

+0

该解决方案似乎可行,但没有给出任何解释。 –

2

我只是通过这个去了。在我的情况下,我不得不让子表具有可空的外键字段,然后通过设置null来删除父关系,然后调用save和delete并刷新。

在执行此操作之前,我没有看到日志中的删除或任何异常。

+0

我有同样的问题,并遇到此线程。我不知道我是否会将此称为解决方案或解决方法,但这是如何删除子对象。 –

2

如果你使用Spring数据的更新版本,你可以使用deleteBy语法......所以你能删除你的注解之一:P

接下来的事情就是,该行为已通过消化道一个吉拉票: https://jira.spring.io/browse/DATAJPA-727

1

您需要添加删除前的功能,在培训班里你有很多对象,例如在教育类与用户配置 教育关系属性。java的

private Set<UserProfile> userProfiles = new HashSet<UserProfile>(0); 

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "educations") 
public Set<UserProfile> getUserProfiles() { 
    return this.userProfiles; 
} 

@PreRemove 
private void removeEducationFromUsersProfile() { 
    for (UsersProfile u : usersProfiles) { 
     u.getEducationses().remove(this); 
    } 
}