Hibernate nextval get id

dgjrabp2  于 2023-08-06  发布在  其他
关注(0)|答案(5)|浏览(101)

我使用带注解的Hibernate。我需要使用一个方法将对象插入到数据库中,该方法需要一个我需要计算的参数,为此我用途:

SQLQuery sqlQuery = getSession().createSQLQuery(queryString);
sqlQuery.executeUpdate();

字符串
queryString包含:

INSERT INTO TABLE(ID, NUMBER) VALUES (SEC_TABLE.NEXTVAL, 549)


对象被插入到数据库中,但是当我试图获取id时,我得到一个空值。
我该怎么办?
当我使用getHibernateTemplate().update(obj);时,我在获取id时没有问题,但我需要自定义sql插入。
谢啦,谢啦

xam8gpfp

xam8gpfp1#

也许我没有得到所有的东西,但是你有没有考虑过通过Session#connection()(可能在Hibernate 4中被删除)或新的Session#doWork() API使用原始JDBC?如果你需要一个例子,这里是你如何使用它:

session.doWork(new Work() {
   public void execute(Connection conn) {
      // do work with the connection
      ...
   }
});

字符串

h9vpoimq

h9vpoimq2#

你的问题有点不清楚,但根据我的理解,我认为你应该首先做一个准备好的语句,读取序列的下一个值,并在创建insert语句时使用该id。此外,请确保提交事务,并可能刷新会话。
作为一个旁注,如果你使用带注解的Hibernate,当Map一个表到一个类时,你可以提供id生成器作为一个序列。通过这种方式,您不必编写jdbc代码来插入实体,只需编写普通的hibernate代码即可。getJdbcTemplate().保存().

holgip5t

holgip5t3#

以下是使用注解的序列示例:

@Id
@Column(name = "OFFER_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OFR_OFFERS_SEQ")
@SequenceGenerator(name = "OFR_OFFERS_SEQ", sequenceName = "OFR_OFFERS_SEQ", allocationSize = 1)
private Long offerId;

字符串
另外,add方法应该看起来像这样:

public <T> T add(final T obj) {
     return get(obj.getClass(), (Long) getHibernateTemplate().save(obj));
}
public final <T> T get(final Class<T> clazz, final Long id) {
     return (T) getHibernateTemplate().get(clazz, id);
}


这些方法来自一个类,而不是从Spring扩展Hibernate DaoSupport,这就是它们如何获得hibernate模板的。
希望这对你有用。

ndasle7k

ndasle7k4#

现在我有这个:

public void sql(final String query) {
    getHibernateTemplate().execute(new HibernateCallback<Object>() {
        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            Query q = session.createSQLQuery(query);
            q.executeUpdate();
            return null;
        }
    });
}

字符串
查询为:

INSERT INTO TABLE (ID, VALUE) VALUES (SEC.NEXTVAL, crypt(1, paswword))


我使用的方法:

public void insert(MyClass object) {
    String password = confFile.getProperty("CRYPT");
    String query = createQuery(object, password);
    sql(query);
}


问题是,当我使用HibernateDaoSupport的方法时,当我使用.persist(object)时,我在对象中有id,但当我使用此方法(加密字段值)时,我试图获得id,但它是null。对象已正确插入数据库。

au9on6nz

au9on6nz5#

public long getNextSequenceId(Class<?> entityClass, String schemaName, EntityManager entityManager) {
    Session hibernateSession = getHibernateSession(entityManager);
    SessionFactory sessionFactory = hibernateSession.getSessionFactory();

    ClassMetadata hibernateMetadata = sessionFactory.getClassMetadata(entityClass);

    if (hibernateMetadata instanceof AbstractEntityPersister)
    {
        AbstractEntityPersister persister = (AbstractEntityPersister) hibernateMetadata;
        String tableName = persister.getTableName();
        String queryString = "SELECT AUTO_INCREMENT FROM information_schema.tables" +
                " WHERE table_name = '" + tableName + "'" +
                " AND table_schema = '" + schemaName + "'";
        int nextSequence = ((BigInteger)em.createNativeQuery(queryString).getSingleResult()).intValueExact();
        return nextSequence - 1;
    }
    return 0;
}

字符串

相关问题