2013-05-07 69 views
0

我嘗試在Play Framework 2.1中創建與JoinTable的單向OneToMany關係。但是,該框架不會生成'JoinTable':「transformation_input_files」。奇怪的部分是,如果我將關係更改爲ManyToMany,則會生成表。這裏是代碼:與JoinTable單向OneToMany關係 - 表不生成

所以它關於包含多個S3Files的Transformation類。這裏是轉換文件:

@Entity 
@Table(name = "transformations") 
public class Transformation extends Model { 

    @Id 
    public Long id; 

    /*...*/ 

    @OneToMany(cascade = CascadeType.PERSIST) 
    @JoinTable(
     name="transformation_input_files", 
     joinColumns = @JoinColumn(name="transformation_id"), 
     inverseJoinColumns = @JoinColumn(name="input_file_id") 
    ) 
    public List<S3File> inputFiles; 
} 

這裏是S3File:

@Entity 
@Table(name="s3files") 
public class S3File extends Model { 

    @Id 
    public Long id; 

    /*...*/ 
} 

的S3Files在更多的車型使用,因此不能是雙向的關係。如果我在@ManyToMany中更改@OneToMany,它會生成連接表,但是,我確實喜歡使用@OneToMany關係。

我該如何解決這個問題?我錯過了什麼嗎?

+0

當A和B之間存在一對多關係(比如說)時,則不需要中間表。 B可以具有AId(外鍵)作爲其列,並且每行將具有由其指向的父A。可能是原因? – sanbhat 2013-05-07 14:20:22

+0

感謝您的評論。這是真的,但是S3Files(在你的例子中是B類)被更多的類使用。所以說,還有其他類如C和D與B具有類似的OneToMany關係,現在B類包含A,C和D的列。如果B由C實例創建並擁有,則A和D爲null,甚至不相關。 – Huub 2013-05-07 14:31:14

+0

映射連接表,該表將自動生成,並將其視爲一種良好的實踐。 – Ziul 2013-05-07 14:36:47

回答

0

在一對多關係中,您必須將關係存儲在「Many」實體中。如果您不想將值存儲在S3File類中,則必須創建另一個類以加入兩個類。

Example: 
@Entity 
@Table(name="transformations_ s3files") 
public class Relation extends Model { 
    @Id 
    public Long id; 

    @ManyToOne 
    public Transformation transformation;   

    @OneToOne 
    public S3File file; 
} 
+0

感謝您的輸入。我將此視爲一種「解決方法」,我將解釋原因。首先,我不喜歡用我們定義實體的相同方式而不是使用關係註釋(但我可以忍受這種方式)來實現實體之間的關係。其次,這種關係的方式應該以適當的方式進行解析,因爲文檔描述了這種關係。 [鏈接到文檔](http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1642) – Huub 2013-05-08 15:44:44

+0

它不是一個解決方法,它使得連接表的實體非常常見,這種方式,當您通過連接表加入時,您的查詢更加靈活,並且您可以在需要時添加非密鑰的額外列。 http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/ – Ziul 2013-05-08 21:27:10

+0

Ebean不支持OneToMany關係中的連接表。 – MaFo 2013-05-09 16:20:41