Отображение гибернации с двумя таблицами - PullRequest
0 голосов
/ 05 января 2011

Я пытаюсь изучить Hibernate, и я мог бы создать простую операцию CRUD, используя один класс и одну таблицу. Я просто читаю Hibernate Doc и некоторые онлайн-уроки.

Но у меня проблема с тем, как определить эту связь с двумя задействованными таблицами. У меня в основном есть таблица Employee с такой структурой.

CREATE TABLE EMPLOYEE
(
 EMP_ID VARCHAR(10) NOT NULL,
 EMP_FIRST_NAME VARCHAR(30) NOT NULL,
 EMP_LAST_NAME VARCHAR(30) NOT NULL,
 STATUS_ID INT NOT NULL,
 PRIMARY KEY (EMP_ID)
);

Поле STATUS_ID ссылается на другую таблицу. STATUS_DESC может быть либо «ПОСТОЯННЫМ», «ДОГОВОРНЫМ», «ПО ЗАПРОСУ»

CREATE TABLE EMP_STATUS
(
 STATUS_ID VARCHAR(10) NOT NULL,
 STATUS_DESC VARCHAR(100) ,
 PRIMARY KEY (STATUS_ID)
);

Я думаю о том, чтобы иметь такой класс сущностей. Теперь моя цель - вернуть список объектов Employee со статусом, но я не знаю, как это сделать.

@Entity
public class Employee{
 //other private instance
 private EmployeeStatus empStatus;
 //getters and setters.
}

public class EmployeeStatus{
 private int statusID;
 private String statusDesc;
 //getters and setters
}

Ответы [ 4 ]

4 голосов
/ 05 января 2011

Вы хотите знать, как отобразить это?ManyToOne?

Employee.java

@Entity
public class Employee{
   //other private instance

   @JoinColumn(name = "empStatus", referencedColumnName = "yourColName")
   @ManyToOne(optional = false)
   private EmployeeStatus empStatus;

   //getters and setters.
}

Не забудьте изменить значение "referencedColumnName" ...

EmployeeStatus.java

@Entity
public class EmployeeStatus{
   @Id //this is your pk?
   private int statusID;
   private String statusDesc;

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "empStatus", fetch = FetchType.LAZY) //or EAGER
   private List<Employee> empList;

   //getters and setters
}
2 голосов
/ 05 января 2011

Чтобы создать связь между двумя таблицами, вам нужно решить:

Являются ли отношения двунаправленными? То есть статусы знают сотрудники или нет? Если нет, то это однонаправленный. В этом случае вы можете добавить аннотацию к классу Employee следующим образом:

@ManyToOne
@JoinColumn(name = "status")
private EmployeeStatus empStatus;

И есть несколько других опций, которые вы можете добавить.

1 голос
/ 05 января 2011

Вы можете делать то, что делаете, но я бы посоветовал, если статусом может быть только одно из трех значений, создайте Enum с тремя значениями. Нет необходимости в отдельной таблице.

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

Более простой ответ - не использовать вторичную таблицу, а просто сохранить состояние в виде строки в объекте домена. Вы можете использовать бизнес-логику в своей модели, чтобы строка String входила в список допустимых значений.

Если вы действительно хотите использовать отношения между двумя сущностями, посмотрите документы гибернации по отношениям многие-к-одному .

0 голосов
/ 05 января 2011

Вы можете использовать HQL для запроса сущностей. Вот так

Query q = s.createQuery("from Employee as e where e.empStatus = :status");
q.setParameter("status", status);
List emps= q.list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...