2013-07-22 2 views
0

Я хотел бы знать, как я могу сопоставить следующие требования с использованием JPAJPA Отображение проекта Entity с Employee Entity

У меня есть Project Entity со следующими атрибутами

projectNo (auto generated) 
projectRequestedBy 
approvedBy 

Сотрудник Entity

employeeNumber (primary key) 
employeeName 
employeeTitle 
employeePhone 

Я хотел бы знать, как я могу эффективно сопоставить employeeNumber с атрибутами projectRequestedBy и approvedBy в объекте проекта?

И я также хотел бы знать, как можно отобразить employeeName, employeeTitle и employeePhone атрибуты, когда я выполнить запрос к Project класса Entity? В идеале я хотел бы иметь следующую запись, если я хотел бы попытаться извлечь записи проекта

projectNo projectRequestedByName projectRequestedByTitle approvedByName approvedByTitle 

Любая помощь является весьма заметным.

Update 1

Проект Entity

@Entity 
@Table(name = "PROJECT") 
public class Project 

private Long projectNo; 

@ManyToOne 
@JoinColumn(name="EMP_NUMBER", insertable =false, updatable=false) 
private Employees employees; 

Сотрудники Entity

@Entity 
@Table(name = "EMPLOYEES") 
public class Employees { 
@OneToMany 
@JoinColumn(name="EMP_NUMBER", nullable = false) 
private Collection<Project> project; 
+0

Прочитайте [документации] (HTTP: // документы. jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/), затем попробуйте что-нибудь. Если вы застряли, вернитесь сюда, покажите, что вы пробовали, и объясните, что не работает. Вы хотите узнать о ассоциациях ManyToOne/OneToMany, а также о HQL и объединениях. –

+0

@JBNizet Я обновил свой вопрос с помощью сопоставления объектов. Я не очень уверен в присоединении к объектам для получения информации о поиске из класса «Сотрудники». Кроме того, я хотел бы знать, что объединение является лучшей практикой в ​​JPA? – user75ponic

+0

@JBNizet То, что я имел в виду для лучшей практики 'join', это использование' @ NamedQueries' – user75ponic

ответ

1

OK. Прежде всего, ваше сопоставление неверно. В двунаправленной ассоциации OneToMany одна сторона должна быть обратной стороной, и это материализуется атрибутом mappedBy. Как показано на рисунке in the documentation

У вас на самом деле два сотрудника OneToMany/ManyToOne betwen и проект. Сотрудник запрашивает много проектов. Сотрудник одобряет многие проекты.

Так что отображение должно выглядеть

@Entity 
public class Employee 
    @OneToMany(mappedBy = "requester") 
    private Set<Project> requestedProjects; 

    @OneToMany(mappedBy = "approver") 
    private Set<Project> approvedProjects; 
} 

@Entity 
public class Project 
    @ManyToOne 
    private Employee requester; 

    @ManyToOne 
    private Employee approver; 
} 

Чтобы получить проект с запрашивающей и его утверждающего в одном запросе,

select p from Project p 
left join fetch p.requester 
left join fetch p.approver 
+0

. Я тщательно рассмотрю ваш ответ и попытаюсь понять его и обязательно вернусь. Большое спасибо. – user75ponic

+0

У меня есть один вопрос, в Project Entity я могу сделать как '@ManyToOne @JoinColumn (name =" Requested_By ") частный запросчик сотрудников;' и '@ManyToOne @JoinColumn (name =" Approved_By ") частный сотрудник, утверждающий;' – user75ponic

+0

Да. Если вы не укажете аннотацию JoinColumn, будет принято имя столбца объединения по умолчанию. –