Вопросы о сохраняющихся элементах отношений - PullRequest
0 голосов
/ 21 сентября 2011

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

Теперь, например, у меня есть соотношение много к одному между профессором и кафедрой.

@Entity
public class Professor {
    @ManyToOne
    @JoinColumn(name="DEPT_ID")
    private Department department;
}
@Entity
public class Department {
    //normal getters and setters
    private int id;
    private String name;
}

Теперь на моей странице JSF. Я обычно добавляю отображение между элементами формы и мой управляемый боб.
Во время операции добавления в веб-интерфейсе обычно отображается раскрывающийся список отделов. при добавлении нового профессора.

<h:inputText value="#{myBean.currentProf.name}"/>
.
. /* other mappings here */
.
<h:selectOneMenu value="#{myBean.currentProf.department.name}>
    <f:selectItems value="#{myBean.allDepartments}"/>
</h:selectOneMenu>
<h:commandButton value="Add" actionListener="#{myBean.handleSave}" />

Теперь мой вопрос: требуется ли сначала получить отдел, а затем установить его на мой текущий собственность профессора, прежде чем продолжать это? Потому что в моем случае я уже установил название отдела, но не идентификатор отдела.

@ManagedBean
public class MyBean{
    public Professor currentProf;
    public BusinessService service;
    public String handleSave(){
        Department dept = service.findDepartment(currentProf.getDepartment().getName());
        currentProf.setDepartment(dept);
        service.createProfessor(currentProf);
    }
    public List<SelectItem> getAllDepartments(){
        return service.getAllDepartments();
    }
}

Я просто показываю свои бизнес-услуги здесь для ясности.

public class BusinessService {
  protected EntityManager em;

  public Professor createProfessor(Professor prof) {
    em.persist(prof);
    return prof;
  }
}

Многие примеры в сети показывают пример, такой как этот:

Department dept = new Department();
dept.setId(1);
dept.setName("Finance");
Prof newProf = new Professor();
newProf.setDepartment(dept);
service.createProfessor(newProf);

Но я думаю, что это не то, как данные представляются и собираются в веб-приложении.

1 Ответ

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

Вам нужен загруженный объект сущности Департамента (или ссылка на его прокси), чтобы иметь возможность связать его с Профессором.Простое имя Департамента не дает вам ссылку на объект сущности.

Посмотрите на эту ссылку из документации Hibernate, Глава 3: 3.3.Загрузка объекта :

Вы можете загрузить состояние объекта с помощью:

dept = em.find(Department.class, deptId);

или просто получить ссылку на него:

dept = em.getReference(Department.class, deptId);  // no db hit

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

Если у вас нет идентификатора, просто имяДепартамент, то вам нужно сделать это так, как вы это делали в своем коде (запросить Департамент через имя).

...