У меня есть 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.
Пожалуйста, помогите.
http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite -associations –
Это не моя ситуация, я попробовал нечто подобное, но это не сработало, потому что у меня также есть составной первичный ключ в таблице приложений – SimLine
Прочтите еще раз. В разделе, в котором я связан, говорится: * В следующем примере идентификатор объекта PersonAddress состоит из двух ассоциаций @ManyToOne *. Это точно **, что у вас есть. В приведенных выше примерах представлены различные другие решения, все из которых имеют ассоциацию ManyToOne как часть идентификатора. –