2010-07-02 2 views
1

В старой базе данных у меня есть три таблицы: пользователи, рабочие группы и пользователиWorkgroup. UsersWorkgroup хранит, какую роль пользователь имеет в рабочей группе. Вот соответствующие фрагменты кода:JPA Compound key with @EmbeddedId

@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; 

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

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

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

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

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

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

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

ответ

1

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

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

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

0

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

@OneToMany(cascade = CascadeType.ALL, mappedBy = "workgroup") 
private Collection<UsersWorkgroup> usersWorkgroupCollection; 
Смежные вопросы