我有一张桌子
用户(id,name);
现在我想为表创建JPA类,以便它可以同时支持两个数据库。
id应该是自动增量。
请提供一些例子,帮助我实现目标。
提前致谢。
答案 0 :(得分:1)
生成器类型
<强>增量强>
This generator supports in all the databases, database independent
This generator is used for generating the id value for the new record by using the
<强>序列强>
Not has the support with MySql
This generator class is database dependent it means, we cannot use this generator class for all the database, we should know whether the database supports sequence or not before we are working with it
点击此链接,它可能会对您有所帮助。
答案 1 :(得分:1)
直接转到GenerationType.TABLE,这是最便携的。它并不依赖于数据库细节,因为递增值是通过SQL完成的。我发现它比AUTO更合适,因为相同的生成类型将独立于数据库提供者使用。您也可以在没有TableGenerator的情况下使用它,但是因为我们的目标是让它与所有数据库完全相同,所以我们明确地提供了所需的值。
在您的情况下,映射是:
@Entity
@TableGenerator(
name="usersGenerator",
table="ID_GENERATOR",
pkColumnName="GENERATOR_KEY",
valueColumnName="GENERATOR_VALUE",
pkColumnValue="USERS_ID",
initialValue = 1,
allocationSize=1)
public class Users {
@Id
@GeneratedValue(strategy= GenerationType.TABLE,
generator = "usersGenerator")
private Integer value;
private String name;
protected Integer getValue() {
return value;
}
protected void setValue(Integer value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
多个表生成器可以使用相同的数据库表(在本例中为ID_GENERATOR)。如果需要,例如因为id的类型,同一个表可以存储多个pk和value列。
TableGenerator的名称对于持久性单元是全局的,因为生成器名称通常是。如果愿意,也可以将注释定位到id属性。
可能需要注意:如果我没记错,一些hibernate版本组合不支持初始值。这通常不限制便携性。只有当我们必须自动生成表并重现完全相同的id值集时才会出现问题。解决方法是在构造表之后手动插入初始值。
答案 2 :(得分:0)
你应该选择世代类型AUTO。我只使用了.hbm映射,但是我的理解是注释看起来应该是这样的:
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;