2015-09-01 3 views
0

У меня есть следующие сущности:Колонка не генерируется при использовании JoinColumn (JPA/Hibernate)

@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 имеет первичный ключ, состоящий из PK IntegrationProject и имени), поэтому они зарегистрированы.

Я позволю Hibernate создать таблицы из Entities при запуске. При этом в таблице FLOWELEMENT отсутствует столбец «MAPPINGNAME».

Я также попытался использовать @PrimaryKeyJoinColumn, который приводит к созданию столбца, но пустой, хотя переменная не является.

Каков правильный способ сделать это (@JoinColumn или @PrimaryKeyJoinColumn) и почему Колонка не создана/не заполнена?

+0

@PrimaryKeyJoinColumn используется с таблицей стратегии JOINED, когда вы использовали стратегию таблицы SINGLE. Прочтите это: https://docs.oracle.com/javaee/5/api/javax/persistence/PrimaryKeyJoinColumn.html –

ответ

0

Благодаря Prerak Tiwari, я нашел решение. Вы не используете @PrimaryKeyJoinColumn вообще в этом сценарии, только @JoinColumn. Все поля первичного ключа, которые являются общими, должны быть помечены как «insertable = false, updateable = false».