У меня есть сущность Application, я хочу выразить двустороннюю связь с атрибутом в JPA.EX.QuoteStore (приложение провайдера) предоставляет сервисы для онлайн-портала, и многие (потребительские приложения) и QuoteStore (приложение-потребитель) используют сервисы Siebel CRM и многие (приложения провайдера). Приведенный выше подход хорошо работает, когда отношения - это ManyToMany, но не само (например, App2DB илиApp2BizCase) Для двунаправленных отношений SelfTyMany с атрибутами на объекте приложения;Я разложил его на две взаимосвязи OneToMany, такие как
App 1--One2Many--* App2AppLink *--ManyToOne-1 App
(Provider 1--One2Many--* App2AppLink *--ManyToOne-1 Consumer)
Вот сущность приложения
@Entity
public class ApplicationEO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
/**
* This application instance services are consumed by Set<App2AppLinkEO> applications connections/links
*/
@OneToMany(mappedBy = "provider")
private Set<App2AppLinkEO> consumberLinks;
/**
* This application instance consumes services by Set<App2AppLinkEO> applications connections/links
*/
@OneToMany(mappedBy = "consumer")
private Set<App2AppLinkEO> providerLinks;
}
Вот таблица привязки приложения к приложению
@Entity
@Table(name="APP2APPLINK")
public class App2AppLinkEO {
@EmbeddedId
@AttributeOverrides({@AttributeOverride(name = "entity1Id", column = @Column(name = "PROVIDER_ID")),
@AttributeOverride(name = "entity2Id", column = @Column(name = "CONSUMBER_ID"))})
private CompositePK id;
@ManyToOne(optional = false)
private ApplicationEO providerApp;
@ManyToOne(optional = false)
private ApplicationEO consumerApp;
private String service;
private String status;
private String platform;
}
А вот код составного первичного ключа
@Embeddable
public class CompositePK implements Serializable {
private long entity1Id;
private long entity2Id;
}
Выше настройки генерирует таблицу отношений как:
CREATE TABLE APP2APPLINK (
PLATFORM VARCHAR(255),
STATUS VARCHAR(255),
SERVICE VARCHAR(255),
PROVIDER_ID BIGINT NOT NULL,
CONSUMBER_ID BIGINT NOT NULL,
CONSUMERAPP_ID BIGINT,
PROVIDERAPP_ID BIGINT,
PRIMARY KEY (PROVIDER_ID, CONSUMBER_ID))
Но почему я вижу там дополнительные столбцы?
CONSUMERAPP_ID BIGINT,
PROVIDERAPP_ID BIGINT,