我创建了一个简单的类和一个简单的数据库表来测试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">
中放置什么来将我的类映射到我的数据库。如果我忽略它,之后会出现一些问题吗?
答案 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类)定义相对应。