Send String second Argument IdentifierGenerator – Hibernate
我为我的应用程序实现了一个自定义生成器,我想将一个字符串作为第二个参数发送到IdentifierGenerator接口,但我没有得到任何线索如何做到这一点。 遗憾的是,由于以下代码,它将null2设置为生成的密钥。 请帮忙。
我想从客户端发送一个字符串作为第二个参数的“日期”。
谢谢。
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; } }
您可以实现Configurable接口并覆盖您的需求配置 。 通过这样做,您只能将静态值作为参数传递给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”。
现在实现Configurable接口的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
设置为某个值,例如“Manager”,则hibernate会生成并且ID类似于“Emp1Manager”。
你的问题不明确,但它显示null2
的原因是你的appendString
是null并且没有初始化。我猜你需要将appendString设置为日期。