0

У меня есть 3 таблицы:
Приложения {id_app, версия, имя}
Клиенты {org_ID, имя}
Ассоциации {id_app, version, org_id, state}.

Приложения имеют составной первичный ключ (id_app, версия), первичный ключ для клиентов - org_id, а ассоциации имеют составной первичный ключ (id_app, version, org_id).Многие-ко-многим с составными ключами, дополнительные колонки в спящем

В моей Java-приложение У меня есть следующие классы:

@Entity 
@Table(name = "Applications") 
@IdClass(ApplicationId.class) 
public class Application implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "ID_APP", nullable = false) 
    private String idApp; 
    @Id 
    @Column(name = "VERSION", nullable = false) 
    private String version; 
    @Column(name = "NAME") 
    private String name; 

    @OneToMany(mappedBy = "idPk.appPk", fetch = FetchType.LAZY) // cascade = CascadeType.ALL) 
    private List<Association> custApps; 

    // getters and setters 
} 


public class ApplicationId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String idApp; 
    private String version; 

    //hashcode and equals 
} 


@Entity 
@Table(name = "CUSTOMERS") 
public class Customer implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "ORG_ID", unique = true, nullable = false) 
    private Integer orgID; 

    @Column(name = "NAME") 
    private String name; 

    @OneToMany(mappedBy="idPk.customerPk", fetch = FetchType.LAZY) 
    private List<Association> custApps; 

    //getters and setters 
} 


@Entity 
@Table(name = "ASSOCIATIONS") 
@AssociationOverrides({ 
    @AssociationOverride(name = "idPk.appPk", joinColumns = @JoinColumn(name = "ID_APP")), 
    @AssociationOverride(name = "idPk.appPk", joinColumns = @JoinColumn(name = "VERSION")), 
    @AssociationOverride(name = "idPK.customerPk", joinColumns = @JoinColumn(name = "ORG_ID")) 
    }) 
public class Association implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private AssociationId idPk = new AssociationId(); 
    private String state; 

    public Association() { 
     super(); 
    } 

    @EmbeddedId 
    public AssociationId getIdPk() { 
     return idPk; 
    } 

    @Transient 
    public Customer getCustomerPk() { 
     return idPk.getCustomerPk(); 
    } 

    @Transient 
    public Application getAppPk() { 
     return idPk.getAppPk(); 
    } 

    @Column(name = "STATE") 
    public String getState() { 
     return state; 
    } 

    //setters , hashCode and equals 
} 


@Embeddable 
public class AssociationId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private Application appPk; 
    private Customer customerPk; 

    // here is the problem ? 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumns({ @JoinColumn(name = "ID_APP", referencedColumnName = "ID_APP"), 
     @JoinColumn(name = "VERSION", referencedColumnName = "VERSION") }) 
    public Application getAppPk() { 
     return appPk; 
    } 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="ORG_ID") 
    public Customer getCustomerPk() { 
     return customerPk; 
    } 

    //setter, hashCode and equals 
} 


Что правильно аннотаций? Отношения между многими приложениями и клиентами зависят от многих, и я создаю таблицу Ассоциации для этого и для дополнительного столбца «Состояние».
Теперь я получаю это Ошибка: Внешний ключ, ссылающийся на sla.model.Application from sla.model.Association имеет неправильное количество столбцов. должно быть 2.
Пожалуйста, помогите.

+0

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite -associations –

+0

Это не моя ситуация, я попробовал нечто подобное, но это не сработало, потому что у меня также есть составной первичный ключ в таблице приложений – SimLine

+0

Прочтите еще раз. В разделе, в котором я связан, говорится: * В следующем примере идентификатор объекта PersonAddress состоит из двух ассоциаций @ManyToOne *. Это точно **, что у вас есть. В приведенных выше примерах представлены различные другие решения, все из которых имеют ассоциацию ManyToOne как часть идентификатора. –

ответ

-1

Выполнено. Меняю следующее:
В классе ассоциации:

@AssociationOverrides({ 
@AssociationOverride(name = "idPk.appPk", joinColumns = { @JoinColumn(name = "ID_APP", referencedColumnName = "ID_APP"), 
    @JoinColumn(name = "VERSION", referencedColumnName = "VERSION") }), 
@AssociationOverride(name = "idPK.customerPk", joinColumns = @JoinColumn(name = "ORG_ID")) 
}) 


Смежные вопросы