我为我的应用程序实现了一个自定义生成器,我想将一个字符串作为第二个参数发送到IdentifierGenerator接口,但我没有得到任何线索如何做到这一点。不幸的是,由于下面的代码,它将null2设置为生成的密钥。请帮忙。
我想发送一个字符串,即" date"从客户端作为第二个参数。
感谢。
public class CourierTransImpl implements IdentifierGenerator{
private String appendString;
@Override
public Serializable generate(SessionImplementor session, Object arg1)
throws HibernateException {
Connection connection = session.connection();
int id=0;
try {
PreparedStatement ps = connection
.prepareStatement("SELECT MAX(TRANS_ID) as value from SecurePass.COURIER_TRANSACTIONS_SER_TABLE");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
id = rs.getInt("value");
id++;
}
ps = connection
.prepareStatement("INSERT INTO SecurePass.COURIER_TRANSACTIONS_SER_TABLE VALUES("+id+")");
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
return appendString+id;
}
public String getAppendString() {
return appendString;
}
public void setAppendString(String appendString) {
this.appendString = appendString;
}
}
答案 0 :(得分:0)
您的问题不明确,但显示null2
的原因是您的appendString
为空且未初始化。我猜您需要将appendString设置为日期。
答案 1 :(得分:0)
您可以实施Configurable界面,并根据您的要求覆盖configure。通过这样做,您只能将静态值作为参数传递给CourierTransImpl
类
如果您想传递一些动态值,那么您可以在实体中定义@Transient
属性,然后在CourierTransImpl
类中访问该属性。
详细说明:
例如,假设有一个名为Employee
的实体,它有一个名为empType
的瞬态属性,那么您可以像这样定义实体。
@Entity
public class Employee {
@Id
@GeneratedValue(generator = "UniqueIdGenerator")
@GenericGenerator(name = "UniqueIdGenerator", strategy = "com.CourierTransImpl",
parameters = { @Parameter(name = "appendString", value = "Emp") })
private String id;
private String name;
@Transient
private String empType;
// Getters & Setters
}
在上面的代码中,您可以看到我们设置参数appendString
,这是一个静态值,我们在这里设置为“Emp”。
现在实现可配置接口的CourierTransImpl
类:
public class CourierTransImpl implements IdentifierGenerator, Configurable {
private String appendString;
@Override
public Serializable generate(SessionImplementor session, Object object)
throws HibernateException {
Connection connection = session.connection();
int id = 0;
try {
Employee emp = (Employee) object;
id = ..; // your logic to get the id from database
// Now you can use the parameter appendString which is static value set to "Emp"
// You can also access any of the employee properties here, so in your code you can set the required value dynamically.
return appendString + emp.getEmpType()+id;
} catch (Exception e) {
e.printStackTrace();
}
return appendString + id;
}
@Override
public void configure(Type type, Properties params, Dialect d)
throws MappingException {
setAppendString(params.getProperty("appendString")); // Here we are setting the parameters.
}
// Setters & Getters
}
在这个例子中,如果我创建一个Employee
的对象并将empType
设置为某个值,说“经理”,那么hibernate生成并且ID就像“Emp1Manager”。