2012-04-19 77 views
1

我有一個包含2個主要列的表:名稱和沒有口音的名稱。 我想Hibernate來更新:第二個,當第一次一個改變:休眠:根據另一個列更新列

@Column(name = "name") 
public String getName() { 
    return this.name; 
} 

public void setName(String s) { 
    this.name = s; 
    this.noAccentName = RemoveDiacritics(name); //remove diacritics from name 
} 

@Column(name = "noaccent_name") 
public String getNoAccentName() { 
    return this.noAccentName; 
} 

public void setNoAccentName(String s) { 
    this.noAccentName = s; 
} 

這是工作,但它有一個開銷:名稱套的制定者反對髒,休眠要更新這一切的時候... :(

我怎樣才能讓Hibernate更新「noAccentName」當「名」在一個乾淨的方式被改變?

非常感謝。

回答

2

你找到了攔截​​,但休眠4做這樣的事情的推薦的方法是使用Callback methods。實際上,我根本找不到Hibernate 4中的攔截器,所以如果你這樣做,你可能沒有升級路徑。

我相信你想做的事是這樣的:

@Column(name = "name") 
public String getName() { 
    return this.name; 
} 

public void setName(String s) { 
    this.name = s; 
} 

@PrePersist 
private void updateNoAccentName() { 
    this.noAccentName = RemoveDiacritics(this.name); 
} 

@Column(name = "noaccent_name") 
public String getNoAccentName() { 
    return this.noAccentName; 
} 

private void setNoAccentName(String s) { 
    this.noAccentName = s; 
} 

Hibernate會那麼就保存對象之前採取更新noAccentName責任。請注意,我還將setNoAccentName方法設置爲私有,因爲沒有辦法將noAccentName轉換爲名稱並獲得正確的重音。

+0

感謝您的建議。簡單而乾淨。 它的工作原理。 :) 我使用@ PreUpdate + @ PrePersist(用於更新和插入) – steve 2012-04-24 11:06:28

0

你能始終獲得noAccentName給定的值名稱?如果是這樣,你應該標記它和getter和setter @Transient以便它們不再受到hibernate的影響。只要設置了名稱,只需設置noAccentName的值,並且hibernate不會更新該特定實例,除非名稱的值發生更改。

編輯: 您也可以試試檢查名稱的平等對於新被分配,所以你不指定任何領域,除非絕對必要(這將導致休眠將其標記爲髒)。如果仍然是更新,那麼要麼是因爲配置了hibernate以更新,而是因爲另一個字段也正在更新。

+0

感謝您的回答,但我希望noAccentName在db中更新。是的:noAccentName總是從名稱派生而來。 我的解決方案的問題:只有當我從表中加載10行時,這會導致更新(因爲hibernate認爲它們已被更改)。 – steve 2012-04-19 13:37:18

0

一個簡單的方法是使用字段訪問而不是屬性訪問,甚至可能只是針對這兩個屬性(請參閱access type,不推薦)。

0

我認爲這是一個域名命名問題。當您在此時調用setName時,您不只是設置名稱。像changeName這樣改變兩者值的另一種方法似乎更合適。雖然我會同意尼爾的觀點,即如果價值始終得出,那麼在堅持名稱和改名時沒有多大價值。如果您是應用程序是唯一使用這些信息的應用程序,那麼爲什麼不刪除該列,並提供一個單獨的訪問器來刪除該二進制文件。

+0

你有權利:刪除該列將會更乾淨。但是它是我們應用程序中的一個特性:當用戶輸入沒有變音符時,搜索(和自動完成等)也會給出變音符號。 – steve 2012-04-20 12:14:45

+0

你的數據庫不允許搜索沒有Diacritical字符? – 2012-04-26 14:29:12

+0

這是最基本的問題。 :) 我們嘗試使用刪除了變音符號的自定義索引,但它有性能問題:db做了很多次錯誤的計劃(和慢速查詢)。 PostgreSQL 9.1.3 – steve 2012-05-04 08:30:14

1

我找到了解決方案。 :)它的名字是hibernate攔截器。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html

用一個簡單的攔截器,我可以更新基於另一個noAccent領域的幫助。

感謝您的時間和精力,

+0

我同意,這*可能是最好的解決方案。您還應該考慮使用@ Neil的答案,因爲代碼位於您的getter和setter中,並且更易於開發人員查看和理解。 – 2012-04-21 01:42:09