Self ManyToMany с дополнительными столбцами с использованием JPA 2.0 - PullRequest
1 голос
/ 22 июня 2011

У меня есть сущность 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, 

1 Ответ

1 голос
/ 22 июня 2011

Вы не устанавливаете @JoinColumn для @ ManyToOne, поэтому они получают имя столбца соединения по умолчанию.Вам нужно дать,

@JoinColumn(name="PROVIDER_ID", insertable=false, updateable=false)

@JoinColumn(name="CONSUMBER_ID", insertable=false, updateable=false)

Вам нужно пометить их как доступные только для чтения, так как вы пишете поле из EmbeddedId (или вы можете пометить его как вставляемый = ложь, обновляемый = ложь)

Но на самом деле вы должны полностью удалить EmbeddedId и просто добавить @Id к @ ManyToOne и определить @ IdClass.

...