2015-09-01 34 views
0

我有以下實體:

@Entity 
@IdClass(IntegrationMappingPK.class) 
public class IntegrationMapping { 
    @Id 
    @ManyToOne 
    private IntegrationProject project; 
    @Id 
    private String mappingName; 
    ... 
} 

@Entity 
public class MappingElement extends FlowElement { 
    @ManyToOne(cascade=CascadeType.PERSIST) 
    @PrimaryKeyJoinColumns({ 
     @PrimaryKeyJoinColumn(name="DISCOVERY_ID", referencedColumnName="DISCOVERY_ID"), 
     @PrimaryKeyJoinColumn(name="SCENARIONAME", referencedColumnName="SCENARIONAME"), 
     @PrimaryKeyJoinColumn(name="PROJECTNAME", referencedColumnName="PROJECTNAME"), 
    }) 
    @JoinColumn(name="MAPPINGNAME", referencedColumnName="MAPPINGNAME") 
    private IntegrationMapping mapping; 
    ... 
} 

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@IdClass(FlowElementPK.class) 
public class FlowElement { 
    @Id 
    @ManyToOne 
    protected IFlow flow; 
    @Id 
    @Basic 
    protected String name; 
    @Id 
    @GeneratedValue 
    private int id; 
    ... 
} 

IntegrationMapping和的FlowElement共享主鍵字段 「DISCOVERY_ID」, 「SCENARIONAME」 和 「PROJECTNAME」(基本上是PK IntegrationProject; IFlow有一個由IntegrationProject的PK和一個Name組成的主鍵),所以它們被連接起來。

我讓Hibernate在啓動時從實體創建表。這樣做時,FLOWELEMENT表中缺少列「MAPPINGNAME」。

我也嘗試過使用@PrimaryKeyJoinColumn,它會導致正在創建的列,但是儘管這個變量並不是空的。

哪種方法可以做到這一點(@JoinColumn或@PrimaryKeyJoinColumn)以及爲什麼不創建/填充列?

+0

@PrimaryKeyJoinColumn與JOINED表策略一起使用,但您已使用SINGLE表策略。閱讀:https://docs.oracle.com/javaee/5/api/javax/persistence/PrimaryKeyJoinColumn.html –

回答

0

感謝Prera​​k Tiwari,我剛找到解決方案。 在此方案中,您完全不使用@PrimaryKeyJoinColumn,而只使用@JoinColumn。共享的所有主鍵字段必須標記爲「insertable = false,updateable = false」。