2010-04-14 129 views
3

我與這些註釋的多對多的關聯映射兩類:JPA: - 許多一對多隻有一個關聯表的外鍵

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class TechnicalItem extends GenericBusinessObject implements Resumable{ 

    @SequenceGenerator(name="TECHNICAL_ITEM_ID_GEN", sequenceName="TECHNICAL_ITEM_ID_SEQ") 
    @Id 
    @Column(name = "\"ID\"", nullable = false) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TECHNICAL_ITEM_ID_GEN") 
    private int id; 


    @ManyToMany(mappedBy = "referencePerformanceItems", fetch=FetchType.LAZY) 
    private List<TestingRate> testingRates; 
} 

@Entity 
@DiscriminatorValue("T") 
public class TestingRate extends Rate { 


    @ManyToMany(fetch=FetchType.LAZY) 
    @JoinTable(name="ecc.\"TESTING_RATE_TECHNICAL_ITEM\"", 
     joinColumns = {@JoinColumn(name = "\"TESTING_RATE_ID\"")}, 
     inverseJoinColumns = {@JoinColumn(name = "\"TECHNICAL_ITEM_ID\"")}) 
    //@ManyToMany(mappedBy = "testingRates", fetch=FetchType.LAZY) 
    private List<TechnicalItem> referencePerformanceItems; 
} 

用SQL的關聯表的創建產生的是:

create table ecc."TESTING_RATE_TECHNICAL_ITEM" (
    "TESTING_RATE_ID" int4 not null, 
    "TECHNICAL_ITEM_ID" int4 not null 
); 
alter table ecc."TESTING_RATE_TECHNICAL_ITEM" 
    add constraint FKC5D64DF6A2FE2698 
    foreign key ("TESTING_RATE_ID") 
    references ecc."RATE"; 

沒有提到第二個外鍵「TECHNICAL_ITEM_ID」(應該在關聯表中的複合外鍵的第二部分)。 這是正常行爲嗎? 如果我想要我的2列是2個外鍵引用我關心的2個表的主鍵,我應該怎麼做映射。

我使用PostGreSQL數據庫和Hibernate作爲JPA提供程序。

回答

3

確保您沒有錯過第二個約束。我有類似的情況,Hibernate生成數據庫架構很好

@ManyToMany(targetEntity = Two.class, cascade = { 
    CascadeType.ALL 
}) 
@JoinTable(name = "ONE_M2MJT_TWO", joinColumns = { 
    @JoinColumn(name = "ONE_ID") 
}, inverseJoinColumns = { 
    @JoinColumn(name = "TWO_ID") 
}, uniqueConstraints = { 
    @UniqueConstraint(columnNames = { 
     "ONE_ID", 
     "TWO_ID" 
    }) 
}) 
public List<Two> getManyToManyJoinTable() { ... } 


create table ONE (MY_SUPER_ID bigint generated by default as identity (start with 1), VALUE_ varchar(255), primary key (MY_SUPER_ID)) 
create table ONE_M2MJT_TWO (ONE_ID bigint not null, TWO_ID bigint not null, unique (ONE_ID, TWO_ID)) 
create table TWO (MY_SUPER_ID bigint generated by default as identity (start with 1), VALUE_ varchar(255), primary key (MY_SUPER_ID)) 
alter table ONE_M2MJT_TWO add constraint FKA575066C950B44B foreign key (TWO_ID) references TWO 
alter table ONE_M2MJT_TWO add constraint FKA575066C045060B foreign key (ONE_ID) references ONE 
+0

感謝lexicore,我不知道「uniqueConstraint」參數。 但我想出了我的問題:我嘗試在多對多關係中包含抽象類「TechnicalItem」,而不是從「TechnicalItem」繼承的「PerformanceItem」類。 然後即使沒有「uniqueconstraint」參數,也會創建2個外鍵。 無論如何感謝, Julien – Julien 2010-04-14 09:12:02