我org.hibernate.id.IdentifierGenerator
用来生成一个主键列,如下所示。在下面给出的示例中,目前它只是INT(11)
按顺序递增类型(MySQL)的键,即它确实像auto_increment
在 MySQL 中一样,但它可以用于生成任何自定义模式的值,如 E0001、E0002、E0003 ... E0010 ... E0100 ... E1000 ... E12345 ...
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.IdentifierGenerator;
public final class TestIdGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
try {
Connection connection = session.connection();
PreparedStatement ps = connection.prepareStatement("SELECT MAX(id) AS id FROM test");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
int id = rs.getInt("id");
return id <= 0 ? 1 : id + 1;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
Test
使用上述 id 生成器的实体:
public class Test implements Serializable {
@Id
@GenericGenerator(name = "test_sequence", strategy = "com.example.TestIdGenerator")
@GeneratedValue(generator = "test_sequence")
@Basic(optional = false)
@Column(name = "id", nullable = false)
private Integer id;
//...
}
然而,这是 Hibernate 特有的功能。有没有办法让它与提供者无关,即 JPA (2.1) 中是否有这样的功能?
我正在使用具有 JPA 2.1 的 Hibernate 5.1.0 final。
这种方法在持久化、合并和删除实体时是否会导致一些并发问题并需要某种锁定?