JPA Составной ключ с @EmbeddedId - PullRequest
1 голос
/ 02 июля 2010

В устаревшей базе данных у меня есть три таблицы: Users, Workgroups и UsersWorkgroup.UsersWorkgroup хранит информацию о роли пользователя в рабочей группе.Вот соответствующие фрагменты кода:

@Entity
@Table(name = "users_workgroup")
public class UsersWorkgroup implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected UsersWorkgroupPK usersWorkgroupPK;

    @JoinColumn(name = "idworkgroup", referencedColumnName = "idworkgroup")
    @ManyToOne(optional = false)
    private Workgroup workgroup;
    @JoinColumn(name = "user_name", referencedColumnName = "user_name")
    @ManyToOne(optional = false)
    private Users users;

    @Column(name = "role")
    private Integer role;


@Embeddable
public class UsersWorkgroupPK implements Serializable {

    @Basic(optional = false)
    @Column(name = "idworkgroup", insertable=false, updatable=false)
    private int idworkgroup;
    @Basic(optional = false)
    @Column(name = "user_name", insertable=false, updatable=false)
    private String userName;


@Entity
@Table(name = "workgroup")
public class Workgroup implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idworkgroup")
    private Integer idworkgroup;
    @Column(name = "name")
    private String name;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idworkgroup")
    private Collection<UsersWorkgroup> usersWorkgroupCollection;

И, конечно, проблема в том, что это не работает.В настоящее время я получаю это исключение:

Описание исключения: Обнаружено несовместимое отображение между [class entity.Workgroup] и [class entity.UsersWorkgroup].Обычно это происходит, когда мощность отображения не соответствует количеству его обратных указателей.

Что я не понимаю, так как OneToMany должен соответствовать ManyToOne ... Или это отношение ManyToMany?Если я переключаюсь на @ManyToMany, я получаю это:

Описание исключения: Целевая сущность атрибута отношения [рабочая группа] в классе [class com.ericsson.rsg.ejb.entity.UsersWorkgroup]не может быть определено.Когда не используются обобщенные элементы, убедитесь, что целевая сущность определена в сопоставлении отношений.

Я пытаюсь понять составные ключи (встроенные), но все примеры, которые я смог найти, содержат только простые столбцыне внешние ключи (но в этом весь смысл составного ключа, не так ли?).Может ли таблица UsersWorkgroup тайно быть таблицей соединений?

Должен ли я объявить класс PK строгим классом POJO?Или я должен поместить аннотации @JoinColumn в классе PK?Как мне сослаться на столбцы в составном ключе из другой таблицы?Должен ли я инициализировать объект PK в конструкторе класса refering или это не нужно?

Я чувствую себя полностью застрявшим.

Ответы [ 2 ]

1 голос
/ 02 июля 2010

Прежде всего, я думаю, что ваше отношение «многие ко многим», так как пользователь может быть во многих группах, и в группе может быть много пользователей (или я бы так предположил).

Во-вторых, какНасколько я знаю, вы должны ссылаться на id_workgroup и user_name как JoinColumns, потому что они являются частью PK и модулем, поэтому на них следует ссылаться.

Кроме того, я вижу, что методы «равно» и «hashCode» отсутствуют во встроенном PK, а также в методах получения / установки.Я считаю, что они являются обязательными.

0 голосов
/ 02 июля 2010

Ваше отображение выглядит нормально, за исключением mappedBy - это должно быть имя свойства, а не имя столбца:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "workgroup") 
private Collection<UsersWorkgroup> usersWorkgroupCollection; 
...