Как определить @ManyToMany внутри созданного объекта - PullRequest
1 голос
/ 24 декабря 2011

у меня есть сгенерированная таблица с именем employee , как отношение между двумя таблицами:

Person , MedicalCompany

и мне было интересно, как установить связь manyToMany между этой сгенерированной таблицей и другой таблицей, например:

@ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "employee_role", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
    private Set<Role> roles = new HashSet<Role>(0);

1- сгенерированная таблица :

@SuppressWarnings("serial")
@Entity
@Table(name = "employee")
@AssociationOverrides(value = {
        @AssociationOverride(name = "pk.medicalCompany", joinColumns = @JoinColumn(name = "company_id", referencedColumnName = "id")),
        @AssociationOverride(name = "pk.person", joinColumns = @JoinColumn(name = "employee_id", referencedColumnName = "person_id")),
        @AssociationOverride(name = "pk.titleText"),
        @AssociationOverride(name = "pk.employeeManager") })
public class Employee implements Serializable {

    @EmbeddedId
    private EmployeeCompanyId pk = new EmployeeCompanyId();

    @Transient
    public void setEmployeeManager(long employeeManager) {
        this.pk.setEmployeeManager(employeeManager);
    }

    public long getEmployeeManager() {
        return pk.getEmployeeManager();
    }

    @Transient
    public void setTitleText(String titleText) {
        this.pk.setTitleText(titleText);
    }

    public String getTitleText() {
        return pk.getTitleText();
    }

    public void setPerson(Person person) {
        this.pk.setPerson(person);
    }

    @Transient
    public Person getPerson() {
        return this.pk.getPerson();
    }

    public void setMedicalCompany(MedicalCompany medicalCompany) {
        this.pk.setMedicalCompany(medicalCompany);
    }

    @Transient
    public MedicalCompany getMedicalCompany() {
        return this.pk.getMedicalCompany();
    }

    public void setPk(EmployeeCompanyId pk) {
        this.pk = pk;
    }

    public EmployeeCompanyId getPk() {
        return pk;
    }

}

2- EmployeeCompanyId :

@SuppressWarnings("serial")
@Embeddable
public class EmployeeCompanyId implements Serializable {

    @ManyToOne
    private Person person;

    @ManyToOne
    private MedicalCompany medicalCompany;

    @Size(max = 150, message = "{long.value}")
    @Column(name = "title_text", length = 150, nullable = true)
    private String titleText;

    @Column(name = "employee_manager")
    private long employeeManager;

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public MedicalCompany getMedicalCompany() {
        return medicalCompany;
    }

    public void setMedicalCompany(MedicalCompany medicalCompany) {
        this.medicalCompany = medicalCompany;
    }

    public String getTitleText() {
        return titleText;
    }

    public void setTitleText(String titleText) {
        this.titleText = titleText;
    }

    public long getEmployeeManager() {
        return employeeManager;
    }

    public void setEmployeeManager(long employeeManager) {
        this.employeeManager = employeeManager;
    }

}

1 Ответ

1 голос
/ 27 декабря 2011

Вы не можете иметь отношения в пределах @Embeddable, что является @EmbeddedId. Вы можете иметь отношения только в обычном @Embeddable.


Спецификация JPA 2.0 FR, 11.1.15 Аннотация EmbeddedId :

Отображения отношений, определенные во встроенном классе идентификаторов, не поддерживается .

Hibernate 3.5 doc, 2.2.3.2.1. @EmbeddedId свойство

Во внедренном объекте id ассоциация представлена ​​как идентификатор ассоциированной сущности . Но вы можете связать его значение с обычной ассоциацией в сущности с помощью аннотации @MapsId.


Минимум, что вы можете сделать, это использовать типы первичных ключей в встраиваемых. Затем вы можете сопоставить их с сущностями, в которых существует встраиваемый объект. Другими словами, вы можете иметь что-то вроде:

@Embeddable
public class EmployeeCompanyId implements Serializable {

    private int personId;

    // ...
}

@Entity
public class Employee {

    @EmbeddedId
    private EmployeeCompanyId pk = new EmployeeCompanyId();

    @MapsId("personId")
    @ManyToOne
    private Person person;

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