Свободно спящий - генерируется по запросу? - PullRequest
0 голосов
/ 14 марта 2012

Обычно мы имеем в Hibernate с C # (беглый Hibernate) ID.(x=>x.Column).Generatedby.Sequence("blabla");

Можно ли сделать что-то вроде "сгенерированный запросом"?Я имею в виду, что я могу указать запрос или хранимую процедуру для получения результата в последовательности?

Мне нужно сделать это, потому что:

my ID равно varchar.Когда я генерирую "generatedby.sequence("sequence"); ", я получаю ошибку об интегральных типах, это, конечно, правильно.

Итак, я написал функцию для решения этой проблемы.Где я делаю процесс значения ID как varchar (xxx0001,xxxx0002.......) с автоинкрементом.Это отлично работает.

Теперь мне нужно присвоить этот результат (функции) моему идентификатору в сопоставленном классе.

Есть способ сделать это?поставить результат "SELECT GenerateSequencesAccountsr('SEQ_TEST',1) AS NextValue FROM dual" в мой "Id (x => x.account) ????.

Я уже думал о возможном решении, чтобы вызвать запрос, прежде чем вставить, но япытаясь сохранить мой "базовый" общий объем, например:

        public virtual void SaveData(object cls)
        {
            using (var session = SessionFactory.OpenSession())
            {
                using (var tx = session.BeginTransaction())
                {

                    session.SaveOrUpdate(cls);
                    tx.Commit();
                }
            }
        }

Есть идеи?

1 Ответ

0 голосов
/ 14 марта 2012
class MyCustomSqlGenerator : IPersistentIdentifierGenerator
{
    private SqlString _sql = new SqlString("your select here");

    public string GeneratorKey()
    {
        return _sql.ToString();
    }

    public string[] SqlCreateStrings(Dialect dialect)
    {
        // TODO: return sql Create of sqlfunction
    }

    public string[] SqlDropString(Dialect dialect)
    {
        // TODO: return sql DROP of sqlfunction
    }

    public object Generate(ISessionImplementor session, object obj)
    {
        try
        {
            IDbCommand cmd = session.Batcher.PrepareCommand(CommandType.Text, _sql, SqlTypeFactory.NoTypes);
            IDataReader reader = null;
            try
            {
                reader = session.Batcher.ExecuteReader(cmd);
                try
                {
                    reader.Read();
                    object result = IdentifierGeneratorFactory.Get(reader, NHibernateUtil.String, session);
                    return result;
                }
                finally
                {
                    reader.Close();
                }
            }
            finally
            {
                session.Batcher.CloseCommand(cmd, reader);
            }
        }
        catch (DbException sqle)
        {
            throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "could not get next sequence value");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...