Как сделать объект из таблицы соединений без первичного ключа - PullRequest
0 голосов
/ 25 марта 2010

Я пытаюсь сгенерировать сущности JPA из существующей базы данных, имеющей «интересный» дизайн.

База данных имеет таблицу с именем UserSet, которая может иметь ссылки на несколько других UserSet. Между UserSets и LinkedUserSets существует отношение один ко многим. LinkedUserSets также имеет непосредственное отношение к UserSets.

Я попытался создать сущность JPA из структуры базы данных, используя Dali JPA Tools. Результирующий объект Linkeduserset пропускает аннотацию @Id или @EmbeddedId и, таким образом, не компилируется. Поскольку получающаяся сущность содержит только два @JoinColumns (которые не могут быть помечены как @Id), я пока не нашел способ обойти эту проблему.

Структура базы данных не может быть изменена никаким образом.

Есть ли способ как-то преодолеть это?

Соответствующие элементы операторов создания таблицы:

CREATE  TABLE `LinkedUserSets` (
  `UsrSetID` INT(11) NOT NULL DEFAULT '0' ,
  `ChildID` INT(11) NOT NULL DEFAULT '0' ,
  CONSTRAINT `fk_LinkedUserSets_UserSet1`
    FOREIGN KEY (`UsrSetID` )
    REFERENCES `UserSet` (`UsrSetID` ));

CREATE  TABLE `UserSet` (
  `UsrSetID` INT(11) NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`UsrSetID`),
  CONSTRAINT `fk_UserSet_LinkedUserSets1`
    FOREIGN KEY (`UsrSetID` )
    REFERENCES `LinkedUserSets` (`ChildID` ));

Сгенерированные объекты:

@Entity
@Table(name="linkedusersets")
public class Linkeduserset {
    //bi-directional many-to-one association to Userset
    @ManyToOne
    @JoinColumn(name="UsrSetID")
    private Userset userset1;

    //bi-directional one-to-one association to Userset
    @OneToOne
    @JoinColumn(name="ChildID")
    private Userset userset2;
}


@Entity
@Table(name="userset")
public class Userset {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="UsrSetID")
    private int jngSetID;

    //bi-directional many-to-one association to Linkeduserset
    @OneToMany(mappedBy="userset1")
    private Set<Linkeduserset> linkedusersets;

    //bi-directional one-to-one association to Linkeduserset
    @OneToOne(mappedBy="userset2")
    private Linkeduserset linkeduserset;
}

Сообщение об ошибке:

Entity "Linkeduserset" has no Id or EmbeddedId

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Если вы хотите отобразить это без изменения базы данных, вы можете подумать о том, чтобы попытаться сопоставить только класс UserSet как сущность, имеющую отношение «многие ко многим» к себе и с LinkedUserSet в качестве таблицы соединения, так что отображение действительно отражает то, что находится в базе данных.

0 голосов
/ 25 марта 2010

Вы все равно должны добавить уникальный столбец PK в таблицу LinkedUserSets. Это поможет укрепить эту таблицу.

Вы также можете создать индекс (уникальный?) В LinkedUserSets (UsrSetId, ChildId) для более быстрого поиска.

... и это не такой "интересный" дизайн. Это довольно часто:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...