休眠保存返回错误生成的id



我在将Hibernate与MSSQL Server 2012一起使用时遇到问题。当我尝试使用Hibernate在某个表中插入值时,无论我做什么,我都会生成id=0。

这是模型。

@Entity
@Table(name = "tbl_ClientInfo")
public class ClientInfo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column (name = "auto_Client_ID", unique=true, nullable=false)
private int auto_Client_ID;
...

这是文字。

public boolean addNewClient(Client client) {
// there is a class that wraps SessionFactory as singleton
Session session = getSessionFactory().openSession();
Transaction tx = null;
Integer clientFamId; //client family info id
Integer clientId;   // actual client id
try {
// create fam info first with some data - need id for ClientInfo
tx = session.beginTransaction();
ClientFam clientFam = new ClientFam();
clientFamId = (Integer) session.save(clientFam);
clientFamId = (Integer) session.getIdentifier(clientFam); // this returns the right id 
session.flush();
ClientInfo clientInfo = new ClientInfo();
clientInfo.setABunchOfFields(withStuff); //multiple methods
session.save(clientInfo);
clientInfoId = (Integer) session.getIdentifier(clientInfo); // this is always 0
session.flush();
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
return false;
} finally {
session.close();
}
return true;
}

在数据库中,PKauto_Client_ID是集群的,设置为IDENTITY(1,1)ClientInfoClientFam记录都是在数据库中创建的,但hibernate返回0。我还尝试从save中获取值,但它也是0。

我不想在单独的插入之间提交:事务是在所有插入都很好的时候进行的(之后还有更多插入,但由于这个id问题,我还无法访问它们)。

ClientFam的模型几乎相同:id字段也是@GeneratedValue(strategy=GenerationType.IDENTITY)

我还尝试为ClientInfo指定此项

@GeneratedValue(generator="increment", strategy=GenerationType.IDENTITY)
@GenericGenerator(name = "increment", strategy = "increment")

我第一次运行它时,它返回了正确的值。然而,我第二次运行它时出现了一个错误:

当identity_insert设置为OFF 时,无法为表"Report"中的标识列插入显式值

尝试到此为止。无论在哪里,我都建议使用GenerationType.IDENTITY作为数据库中的自动递增字段。这应该返回正确的值。我可能做错了什么?

我还尝试从ClientInfo对象本身获取id(我认为应该将其写入其中),但它也是0。这让我觉得我的ClientInfo模型和/或其中的注释有问题。

我发现我的情况有问题——与Hibernate无关。有一个instead of insert触发器没有返回id,因此打乱了save()返回的内容。

这只是一个有根据的猜测,但您可能希望从@Column定义中删除"unique=true"子句。Hibernate可能将列处理为唯一约束,而不是主键。

最新更新