2017-02-26 93 views
0

請參閱以下關係:ON UPDATE CASCADE Hibernate的JPA不會觸發

relations

RECIPE_USERCATEGORY_RELON UPDATE CASCADE觸發,所以如果我想在PSQL控制檯執行以下命令,的ruc_ucat_category值將也會自動更新。

update usercategory set ucat_category = 'OldCategory' where ucat_category = 'NewCategory'; 

This works。 現在的問題是Hibernate。我在我的服務類中有這種方法:

public void renameCategory(String userId, String fromCategory, String toCategory) 
{  
    TypedQuery<UserCategory> query = entityManager.createNamedQuery("UserCategory.findAllCaseSensitiveByUserIdAndPrefix", UserCategory.class); 
    query.setParameter(ApplicationConstants.PARAM_USER_ID, userId); 
    query.setParameter("category", fromCategory); 
    List<UserCategory> resultList = query.getResultList(); 

    if (resultList == null || resultList.isEmpty()) 
    { 
     return; 
    } 

    UserCategory userCategory = resultList.get(0); 
    userCategory.setCategory(toCategory);   
} 

我可以保證userCategory的值爲'OldCategory'。在我看來,更新應該是可行的,因爲數據庫的觸發器應該更新關係表的值,但沒有任何反應。這是爲什麼?
附加信息:在我的實體,沒有對USERCATEGORY <沒有@OneToMany@ManyToOne聲明 - >RECIPE_USERCATEGORY_REL關係(僅適用於RECIPE < - >RECIPE_USERCATEGORY_REL關係是)。這是因爲RECIPE_USERCATEGORY_REL不是真正的連接表。 USERCATEGORY類似於不斷增長的查找表,因此Hibernate 肯定不會干擾此處的工作流程。唯一的關係是USERCATEGORY < - >RECIPE_USERCATEGORY_REL是數據庫中的參照完整性。

這是實體是什麼樣子,但正如我所說,沒有休眠關係的類別表因爲Hibernate不應該關心這個關係:

@Table(name = "RECIPE_USERCATEGORY_REL") 
public class RecipeUserCategoryRel implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private RecipeUserCategoryRelPk recipeUserCategoryRelPk = new RecipeUserCategoryRelPk(); 

    @MapsId("rcpId") 
    @ManyToOne 
    @JoinColumn(name = "ruc_rcp_id", referencedColumnName = "rcp_id", insertable = false, updatable = false) 
    private Recipe recipe; 

... 
} 

和...

@Embeddable 
public class RecipeUserCategoryRelPk implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Column(name = "ruc_rcp_id") 
    private Long rcpId; 

    @Column(name = "ruc_ucat_category") 
    private String category; 

    @Column(name = "ruc_ucat_acc_identifier") 
    private Long identifier; 

    public RecipeUserCategoryRelPk() 
    { 
    } 
... 
//getters, setters, hashcode, equals 
} 

回答

0

我在其他一些帖子中讀過JPA不允許更改主鍵。但是,我的用例肯定會改變主鍵,但就我而言,這不是一個常見用例,也不是應用程序的「真正」部分,但有些情況下用戶需要修改舊數據,所以我需要提供這個功能。 (作爲解決方法,我做了本機更新查詢)

相關問題