2014-03-27 29 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); 
    } 
}