2013-06-14 3 views
3

Я создал простой класс и простые таблицы базы данных для проверки концепций спящего режима. Класс назван "Сотрудник":Как сопоставить файл сопоставления hibernate без идентификатора атрибута в классе?

public class Employee { 
    private String firstName; 
    private String lastName; 
    private int salary; 
    public Employee(String fname, String lname, int salary) { 
     this.firstName = fname; 
     this.lastName = lname; 
     this.salary = salary; 
    } 
    ... 
} 

Названия базы данных "СОТРУДНИК":

create table EMPLOYEE (
    id INT NOT NULL auto_increment, 
    first_name VARCHAR(20) default NULL, 
    last_name VARCHAR(20) default NULL, 
    salary  INT default NULL, 
    PRIMARY KEY (id) 
); 

Это мой Employee.hbm.xml:

<hibernate-mapping> 
    <class name="Employee" table="EMPLOYEE"> 
     <id name="id" type="int" column="id"> 
     <generator class="native"/> 
     </id> 
     ... 
     ... 
    </class> 
</hibernate-mapping> 

Итак, вы можете заметить, что в моем классе у него нет атрибута «id». Однако я создаю столбец id в моей базе данных, чтобы он стал основным ключом, который автоматически генерируется. В этом случае я не знаю, что мне следует поместить в <id name="?" type="int" column="id">, чтобы сопоставить мой класс с моей базой данных. Если я проигнорирую это, это будут некоторые проблемы после этого?

+0

не будет ли это зависеть от того, как ваши дескрипторы «auto_increment» обрабатываются и почему вы не хотите отображать это в классе? –

+0

@domfarr: Значит, мне не нужно определять его в Employee.hbm.xml, не так ли? Тем не менее, я думаю, что это будет некоторые проблемы после этого. – lvarayut

ответ

3

Я могу понять, откуда вы пришли, но Hibernate идентифицирует объекты (в кеше первого и второго уровня) с использованием идентификатора объекта, поэтому объект без идентификатора не может быть представлен в спящем режиме.

Я бы порекомендовал вам создать поле с классом генератора как native и позволить db справиться со значением.

так в аннотации, вы бы сказали

@Id @GeneratedValue(strategy=GenerationType.NATIVE) 
private Integer id; 

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

1

По моему опыту, вы должны сохранить id как атрибут класса POJO (Employee class). Причина этого заключается в том, что идентификатор может понадобиться, если вы хотите найти конкретный объект Employee в базе данных (для методов Hibernate Session get() и load() требуется идентификатор). Кроме того, поскольку вы сопоставили идентификатор в качестве атрибута в файле сопоставления Hibernate, он должен поэтому соответствовать определению свойств/атрибутов POJO (Employee class).

+0

Я согласен с вами, но есть некоторые ситуации, когда класс не принадлежит мне. Поэтому я не могу его изменить. Я должен создать базу данных, следуя требованиям пользователя. – lvarayut

+0

@Maverick, тогда вам нужно обернуть класс и предоставить свой собственный идентификатор или использовать объект транслятора для перевода между классом, который у вас нет, и вашим постоянным представлением – blank

2

Вы можете использовать композитный ключ, если вы не хотите использовать @Id, вы можете использовать аннотацию @EmbededId.

Смежные вопросы