2011-03-23 74 views
10

我必須在遺留數據庫中應用JPA,並採用可怕的設計。不幸的是不可能改變它。幸運的是隻用於只讀訪問。@ManyToMany無連接表(遺留數據庫)

我發現的最奇怪的事情之一是沒有連接(或中間)表的「多對多」關係。這是表結構的簡化:

USER      ACCESS 
----      ------ 
ID int primary key  ID int primary key 
NAME varchar2(20)   NAME varchar2(20) 
ACCESS_GROUP int   ACCESS_GROUP int 
  • ACCESS_GROUP列可以兩個表
  • 一個用戶可以與N個存取
  • 一個接入可以與n個用戶在重複

「概念」 這個表必須用Java類映射是這樣的:

public class User { 
    private Integer id; 
    private String name; 
    @ManyToMany private List<Access> accessList; 
} 

public class Access { 
    private Integer id; 
    private String name; 
    @ManyToMany private List<User> userList; 
} 

但我認爲這是不可能的。您認爲在JPA中訪問這些表格並瀏覽它們的最佳方法是什麼?

+0

其實,這不是A M:M。如何存儲用戶或訪問行是兩個訪問組的一部分?實現這一目標的唯一方法是複製其他列(PK除外),在這種情況下,從設計的角度來看,它們是不同的實體。相反,你擁有兩個獨立的1:M關係。 – Thomas 2011-03-23 18:29:53

回答

8

你可以嘗試將其映射爲只讀一個一對多的關係二:

public class User { 
    @Column(name = "ACCESS_GROUP") 
    private Integer group; 

    @OneToMany 
    @JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP", 
     insertable = false, updateable = false) 
    private List<Access> accessList; 
    ... 
} 

public class Access { 
    @Column(name = "ACCESS_GROUP") 
    private Integer group; 

    @OneToMany 
    @JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP", 
     insertable = false, updateable = false) 
    private List<User> userList; 
    ... 
} 
+0

我試過非常類似的事情,但沒有成功。也許我的問題是我沒有在雙方聲明「整數組」。謝謝! – sinuhepop 2011-03-24 10:52:29

+0

不會爲ACCESS_GROUP添加一個新的唯一約束嗎? – fireants 2015-10-07 18:33:44