Сопоставление проблем один-ко-многим, когда целевая сущность имеет составной первичный ключ, но источник не - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть случай использования, когда пользователь получил несколько профилей: так, связь один-ко-многим.

Это отображается через эти устаревшие таблицы в псевдо sql.

TABLE USER
(
  ID PK
  SURNAME VARCHAR2(45 BYTE) NOT NULL,
  NAME    VARCHAR2(45 BYTE) NOT NULL,
  USER_ID NUMBER
)

TABLE USER_PROFILES
(
  USER_ID      NUMBER                           NOT NULL,
  ID_PROFILO   NUMBER                           NOT NULL,
  DESCRIPTION  VARCHAR2(32 BYTE)
)

Это отображение Java:

@Entity
@Table(name = "USER)
public class User{

    @Id
    @Column(name = "ID")    
    private String id;

    @OneToMany(fetch= FetchType.EAGER)
    @JoinColumns({ @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")})
    private List<UtenteProfilo> profiles;
}

и класс userprofiles

@Entity
@Table(name = "USER_PROFILES")
@IdClass(UserProfile.UserProfileId.class)
public class UserProfile implements java.io.Serializable {
    @Id
    @Column(name = "USER_ID", nullable = false)
    private Long userId;

    @Id
    @Column(name = "ID_PROFILO", nullable = false, insertable = false, updatable = false)
    private Long profiloId;

    private String description;

    static public class UserProfileId implements Serializable {
        @Id
        @Column(name = "USER_ID", nullable = false)
        Long userId;
        @Id
        @Column(name = "ID_PROFILO", nullable = false)
        Long profiloId;
    }
}

Когда я получаю пользователя от UserDao, я получаю это исключение:

Exception Description: The @JoinColumns on the annotated element [field profiles] from the entity class [User] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.

проблема в том, что на исходном объекте (который связывает 1-N) у меня есть только один столбец для объединения.

Я попытался изменить идентификатор целевого объекта;поэтому в классе user_profiles объявляется только user_id в качестве ключа: но таким образом, когда jpa создает запрос, он обрабатывает только один случай user_profiles, делая отношение как 1-1.

Любая идея, как решить проблему и сделатьработа ассоциации?

С уважением Массимо

1 Ответ

1 голос
/ 06 сентября 2011

JPA требует, чтобы идентификатор использовался во всех отношениях.Вы можете сделать userId идентификатором в User или использовать Id в качестве внешнего ключа вместо UserId.

Вы, похоже, используете EclipseLink.Таким образом, вы можете отобразить это как есть, но вам, скорее всего, нужно использовать DescriptorCustomizer и API для сопоставления OneToMany для определения внешнего ключа (поддержка EclipseLink с использованием альтернативных ключей, только не через аннотации JPA).

Технически EclipseLinkдолжен поддерживать аннотации для альтернативных ключей, поэтому зарегистрируйте ошибку и проголосуйте за нее.

...