2016-11-16 1 views
0

Я хочу, чтобы hibernate создать SQL базу на следующем отображении:Как установить имя внешнего ключа, сгенерированное спящим режимом на соединительной таблице?

@Entity 
public class MyBaseEntity { 
    @EmbeddedId 
    private MyEmbeddable id; 

    @ManyToMany 
    @JoinTable(name = "mybaseentity_mymode", //sets the linking table name 
    joinColumns = { 
     @JoinColumn(name = "fk_param1", referencedColumnName = "param2"), //@Id param 
     @JoinColumn(name = "fk_pram2", referencedColumnName = "param2")}, //@Id param 
      foreignKey = @ForeignKey(name = "fk_myembeddable_id")) //the contraint name 
    private Set<MyModes> modes; 
} 

@Embeddable 
public class MyEmbeddable { 
    private String param1; 
    private String param2; 
} 

@Entity 
public class MyMode { 
    @Id 
    private long id; 

    private String code; 
} 

Каждый MyBaseEntity может иметь несколько режимов. И тот же MyMode может быть связан с несколькими базовыми объектами.

Вопрос: как определить сгенерированное имя CONSTRAINT и UNIQUE внутри автогенерируемого связующего стола?

До сих пор я использовал @JoinTable и два определения @JoinColumn, чтобы установить ограничение ссылки @EmbeddedId. Но ссылка на ограничение внешнего ключа для объекта MyMode по-прежнему автогенерируется.

Результирующий SQL до сих пор с автогенерируемая имена:

CREATE TABLE public.mybaseentity_mymode 
(
    mybaseentity_param1 character varying(255) NOT NULL, 
    mybaseentity_param2 character varying(255) NOT NULL, 
    modes_id bigint NOT NULL, 
    CONSTRAINT mybaseentity_mymode_pkey PRIMARY KEY (mybaseentity_param1, mybaseentity_param2, modes_id), 
    CONSTRAINT fk9tr9k9gtbqcpvoxfv2hqop6ta FOREIGN KEY (modes_id) 
     REFERENCES public.mymode (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT fk_myembeddable_id FOREIGN KEY (fk_param1, fk_param2) 
     REFERENCES public.mybaseentity (param1, param2) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

ответ

1

Определим пользовательские ForeignKey ограничения, следуя путем Вы можете использовать @ForeignKey(name="something_something") для этой цели.

И вы определяете @OneToOne, @ManyToOne отображения можно также использовать @ForeignKey встроенный в @JoinColumn так:

@JoinColumn(name = "your_id", foreignKey = @ForeignKey(name = "something_something")) 

И @ManyToMany отношений вы можете использовать uniqueConstraints, foreignKey и inverseForeignKey встроенный в @JoinTable

Однако , Я не уверен, что он будет работать так, как вы хотите определить свои ограничения.

+0

И как я могу создать отображение «ForeignKey» самого ключа, состоящего из двух pks? (например, '@ EmbeddedId' здесь' mybaseentity_param1, mybaseentity_param2')? – membersound

+0

См. Мое обновление выше. Я мог бы назвать одно из ограничений с помощью '@ JoinTable' и' @ JoinColumn'. Но как я могу назвать оставшуюся? – membersound

0

Решение следующим образом: второе ограничение устанавливается с использованием параметров inverse*.

@ManyToMany 
@JoinTable(name = "mybaseentity_mymode", //sets the linking table name 
    joinColumns = { 
     @JoinColumn(name = "fk_param1", referencedColumnName = "param2"), //@Id param 
     @JoinColumn(name = "fk_pram2", referencedColumnName = "param2")}, //@Id param 
     foreignKey = @ForeignKey(name = "fk_myembeddable_id"), //the contraint name 
    inverseJoinColumns = @JoinColumn(name = "fk_mode", referencedColumnName = "id"), 
    inverseForeignKey = @ForeignKey(name = "fk_mode_id")) 
private Set<MyModes> modes; 
Смежные вопросы