java - 如何使用 jpa 和 hibernate 为不同的子类实体生成 id
问题描述
我有以下 AbstractCompany 超类实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class AbstractCompany {
@Id
@GenericGenerator(name = "rju_id", strategy = "com.ivc.talonsystem.util.keygens.RjuIdGenerator")
@GeneratedValue(generator = "rju_id")
@Column(name = "id")
private Integer id;
// other properties and getters-setters for them
}
和子类 Rju:
@Entity
@Table(name="rju")
public class Rju extends AbstractCompany implements Serializable {
@NotEmpty
@Column(name = "fullname")
private String namerju;
@NotEmpty
@Column(name = "briefname")
private String briefname;
// other properties and getters-setters for them
}
和用于为 Rju 实体生成 id 的 RjuIdGenerator 类:
public class RjuIdGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
Connection connection = session.connection();
try {
Statement statement=connection.createStatement();
ResultSet rs=statement.executeQuery("select max(id) as Id from Rju");
if(rs.next())
{
int id=rs.getInt(1)+1;
Integer generatedId = new Integer(id);
return generatedId;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
这个 RjuIdGenerator 类为所有超类和子类生成 id。如何为特定子实体添加另一个生成器类?提前致谢!!!
解决方案
伙计们,我找到了解决这个问题的方法。我所做的只是检查 RjuIdGenerator 的 generate 方法中的对象实例,然后使用适当的表查询获取特定类的生成 id:
public class RjuIdGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
Connection connection = session.connection();
try {
Statement statement=connection.createStatement();
if (object.getClass().getName()==Rju.class.getName()) {
ResultSet rs=statement.executeQuery("select max(id) as Id from Rju");
if(rs.next())
{
int id=rs.getInt(1)+1;
Integer generatedId = new Integer(id);
return generatedId;
}
} else {
ResultSet rs=statement.executeQuery("select max(id) as Id from AbstractCompany");
if(rs.next())
{
int id=rs.getInt(1)+100000;
Integer generatedId = new Integer(id);
return generatedId;
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
推荐阅读
- c++ - QFile::copy 是否将源文件权限保留在复制的文件中?
- java - Kotlin 错误:“public”函数暴露了它的“public/*package*/”返回类型参数
- mocha.js - 测试混合的基于异步/承诺的代码和基于回调的代码
- codeigniter - 如何将设置规则中的多个参数发送到codeIgniter中的公共函数
- sql - 如何在 SQL 表的开头添加行号列?
- javascript - 获取在 ajax 函数之后动态加载的正确表单 id 格式
- php - 获取数据后创建文件'php'
- javascript - 有换行符时切断文本
- c - C - 存储偶数直到输入结束
- android - Intune 是否支持使用 Wrapping Tool 使用 Xamarin 构建 Android apk?