EJB3 - обработка нестандартных таблиц ссылок - PullRequest
0 голосов
/ 29 апреля 2009

У меня есть ситуация, когда я работаю с EJB3 и устаревшей базой данных. У меня есть ситуация, когда между двумя таблицами A и B существует отношение «многие ко многим», определенное с помощью третьей (ссылка) таблицы L.

Сложность состоит в том, что в таблице ссылок есть и другие поля, кроме PK таблиц A и B. Столбцы представляют собой стандартную метку времени и пользовательские столбцы для записи того, кто сгенерировал ссылку. Эти два дополнительных столбца не позволяют мне определить отношение «многие-многие» с помощью аннотации таблицы соединений, поскольку они не допускают ноль и поэтому должны быть заполнены.

Кто-нибудь знает способ обойти это ограничение? Я мог бы определить отношения «один ко многим» из таблицы связей с каждой из других таблиц в отношениях, но это не очень элегантно.

Спасибо

1 Ответ

1 голос
/ 29 апреля 2009

Да, но вам нужно сделать это элегантно. Следующий суперкласс может использоваться для определения произвольного отношения «многие ко многим» как объекта:

@MappedSuperclass
public abstract class ModelBaseRelationship {

    @Embeddable
    public static class Id implements Serializable {

        public Long entityId1;
        public Long entityId2;

        @Column(name = "ENTITY1_ID")
        public Long getEntityId1() {
            return entityId1;
        }

        @Column(name = "ENTITY2_ID")
        public Long getEntityId2() {
            return entityId2;
        }

        public Id() {
        }

        public Id(Long entityId1, Long entityId2) {
            this.entityId1 = entityId1;
            this.entityId2 = entityId2;
        }

        @Override
        public boolean equals(Object other) {
            if (other == null)
                return false;
            if (this == other)
                return true;
            if (!(other instanceof Id))
                return false;
            final Id that = (Id) other;
            return new EqualsBuilder().append(this.entityId1, that.getEntityId1()).append(this.entityId1, that.getEntityId2()).isEquals();
        }

        @Override
        public int hashCode() {
            return new HashCodeBuilder(11, 111).append(this.entityId1).append(this.entityId2).toHashCode();
        }

        protected void setEntityId1(Long theEntityId1) {
            entityId1 = theEntityId1;
        }

        protected void setEntityId2(Long theEntityId2) {
            entityId2 = theEntityId2;
        }
    }

    protected Id id = new Id();

    public ModelBaseRelationship() {
        super();
    }

    public ModelBaseRelationship(ModelBaseEntity entity1, ModelBaseEntity entity2) {
        this();
        this.id.entityId1 = entity1.getId();
        this.id.entityId2 = entity2.getId();
        setVersion(0);
    }

    @EmbeddedId
    public Id getId() {
        return id;
    }

    protected void setId(Id theId) {
        id = theId;
    }

}

Пример сущности, основанной на этом суперклассе (фрагмент):

@Entity(name = "myRealEntity")
@Table(name = "REAL_TABLE_NAME", uniqueConstraints = { @UniqueConstraint(columnNames = {
 "FIRST_FK_ID", "SECOND_FK_ID" }) })
@AttributeOverrides( {
@AttributeOverride(name = "entityId1", column = @Column(name = "FIRST_FK_ID")),
@AttributeOverride(name = "entityId2", column = @Column(name = "SECOND_FK_ID"))    
})
public class ModelBaseRelationshipReferenceImpl extends ModelBaseRelationship {

  private Entity1OfManyToManyRelationship entity1;
  private Entity2OfManyToManyRelationship entity2;
  ...
  @ManyToOne
  @JoinColumn(name = "FIRST_FK_ID", insertable = false, updatable = false)
  public Entity1OfManyToManyRelationship getEntity1OfManyToManyRelationship() {
    return entity1;
  }

  @ManyToOne
  @JoinColumn(name = "SECOND_FK_ID", insertable = false, updatable = false)
  public Entity2OfManyToManyRelationship getEntity2OfManyToManyRelationship () {
    return entity2;
  }
...
}
...