如何在类中映射没有属性id的hibernate映射文件?

时间:2013-06-14 10:09:51

标签: java hibernate

我创建了一个简单的类和一个简单的数据库表来测试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;
   }
   ...
}

数据库名称为“EMPLOYEE”:

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">中放置什么来将我的类映射到我的数据库。如果我忽略它,之后会出现一些问题吗?

3 个答案:

答案 0 :(得分:3)

我可以理解你的来源,但是Hibernate使用对象的ID来识别对象(在第一级和第二级缓存中),因此没有ID的对象无法在休眠中表示。

我建议您使用生成器类native创建字段,并让db处理该值。

所以在注释中你会说

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

如果你不想多次重复这个条目,你可以创建一个基类(基础pojo),它具有这个并扩展你所有模型中的类。

答案 1 :(得分:2)

您可以使用复合键概念,如果您不想使用@Id,可以使用@EmbededId注释。

答案 2 :(得分:1)

根据我的经验,您应该将id作为POJO(Employee类)的属性。原因是当您想要在数据库中搜索特定的Employee对象时可能需要id(Hibernate Session的get()load()方法需要id)。另外,因为您已将id作为属性映射到Hibernate Mapping文件中,所以它应该与属性/属性的POJO(Employee类)定义相对应。