2016-11-16 16 views
0

我想让hibernate以下映射创建SQL基地:如何在链接表上设置hibernate生成的外键约束名?

@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可以链接到多个基础实体。

问题:如何在自动生成的链接表中定义生成的名称CONSTRAINTUNIQUE

到目前为止,我使用@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(name="something_something")为此,自定义的ForeignKey约束。

而且要定义@OneToOne@ManyToOne映射您也可以使用@ForeignKey嵌入@JoinColumn这样的:

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

并为@ManyToMany关系可以用uniqueConstraintsforeignKeyinverseForeignKey嵌入@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;