2011-12-01 29 views
0

需要一些幫助瞭解我是否在正確的軌道上,以及我需要做什麼。希望有人可以參加。需要關於將對象映射到數據庫,註釋和一對多關係的說明

所以我有三張表,Job,Authorization和Filter。每個作業必須有一個授權和一個過濾器。當然,每個過濾器可以被多個作業使用,授權也是如此。但是,過濾器和授權不需要知道他們正在使用的作業。

因此,這是一個過濾器和授權的一對多關係,我認爲是正確的?或者我偏離軌道?這是如何在數據庫中建模的?我相信Job表需要在過濾和授權表中有一個外鍵字段。過濾和授權表需要將外鍵字段本身用於Job嗎?

接下來,我如何在Java對象中對此進行建模,然後如何設置hibernate或java持久性註釋?我相信Filter類看起來像:

class Filter { 

    @OnetoMany 
    @JoinColumn(name="filterID") 
    private Job job; 
} 

和Authorization類基本相同,那麼Job類將如何顯示?真正引起我興趣的是Filter和Authorization類不需要任何關於它們關聯的Job的知識,所以我沒有看到它們需要實際持有對Job對象的引用。只有Job類需要保存對Filter和Authorization對象的引用。那麼我真的需要上面的代碼嗎?

我希望有人可以幫助澄清這一切,因爲我似乎無法包圍我的頭。數據庫並不是我的強項。謝謝。

回答

1

據我所知,使用@OneToMany註釋不是很適合你的情況。也許你可能希望另一方擁有這種關係。

檢查這篇文章出來: http://josian.wordpress.com/2006/09/09/hibernate-annotations-bidirectional-one-to-many/

所以,你的問題,不,你並不需要上面的代碼。

你需要的東西是這樣的:

class Job { 

    @Id 
    //stuff... 


    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn (name="authorization_id", nullable = false, updatable = false, insertable = false) 
    private Authorization authorization; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn (name="filter_id", nullable = false, updatable = false, insertable = false) 
    private Filter filter; 
} 

,並在你的過濾器

@Entity 
@Table(name="filter") 
class Filter { 

     //some stuff, but no relation! 
} 

編輯: 的@JoinColumn就是要顯示在您的工作表的名稱。默認情況下,如果您不指定連接çcolumn名稱,它將是{foreignTableName} _id。在Authorizatrion的情況下,如果註釋是這樣的:

@Entity 
@Table(name="foo") 
class Authorization{ 
@Id 
@column(name="auth_id") 
private Long authId; 
} 

默認投身於工作表爲您生成將

"foo_id"列,將在引用

"auth_id"

"foo"表。

到你最後的評論:

其實你不需要把外鍵的分貝。在工作實體中,

@ManyToOne註釋已經確保鑰匙將被放置給你

@JoinColumn指定外鍵的名稱。例如,如果你想在工作表中的授權的外鍵的名字被稱爲「authorization_fk」,你會使用

@JoinColumn('authorization_fk')

,這是它是如何會被放置在您工作表。

+0

這就是我的想法。正如我所說的,Job需要知道過濾器和授權,但不是其他方式,所以我希望我不需要在Filter或Authorization類中放置任何代碼。所以ManyToOne是我想要的嗎?謝謝。我很困惑,雖然我見過一些其他的東西。上述代碼中的authorization_id列是否引用授權表或作業表中的列?外鍵在哪裏?就在工作表中? – cardician

+1

authorization_id是hibernate將在Job表中爲您創建的連接列的名稱。您可能不會指定它,它會爲您創建。此authorization_id字段將具有與Authorization對象中的相應主鍵完全相同的值。我會繼續我的帖子。 –

+0

非常好,謝謝!最後一點,我不確定,我需要把外鍵放在數據庫中?我假設我需要在我的數據庫中創建一個實際的外鍵關係,那只是在Job表上? – cardician

1

其實,你應該使用many-to-one關係,從JobFilter,另一個從JobAuthorization

正如Hibernate文檔中(見24.1. A note about collections)指出,從Filter一個one-to-many參考Job將使Job視爲Filter實體,而這正是你想要的正好相反的一部分。所以,Job必須指向Filter。由於很多Job可能指向相同的Filter,這是一個many-to-one的關係。

你會寫你的Job類是這樣的:

public class Job { 

    ... 

    @ManyToOne 
    @JoinColumn(name="filter_fk") 
    private Filter filter; 

    @ManyToOne 
    @JoinColumn(name="authorization_fk") 
    private Authorization authorization; 

} 
+0

非常好的解釋,謝謝。我仍然有一些困惑,所以我也會問你。您的代碼中引用的filter_fk列在哪裏?該列是否在Filter表或Job表中?我不清楚那部分,還有我在哪裏放外鍵?在工作表上的權利?所以我會在Job表中創建一個包含ID並且是Filter表ID的外鍵的列?我的理解是否正確? – cardician

+0

這些列是在「Job」表中創建的。你不會「放」外鍵,Hibernate會照顧到這一點。 Hibernate把它放在'Job'表上。你理解正確。 – yair