JPA: многие ко многим - только один внешний ключ в таблице ассоциации - PullRequest
3 голосов
/ 14 апреля 2010

Я сопоставил два класса в ассоциации ManyToMany с этими аннотациями:

@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.

1 Ответ

4 голосов
/ 14 апреля 2010

Убедитесь, что вы не пропустили второе ограничение. У меня есть похожие случаи, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...