H2 не сработает при вводе NULL в столбцы NOT NULL [дубликат]

Члены класса:

Для деструктора pure virtual требуется реализация.

Объявление деструктора по-прежнему требует определения его (в отличие от обычной функции):

struct X
{
    virtual ~X() = 0;
};
struct Y : X
{
    ~Y() {}
};
int main()
{
    Y y;
}
//X::~X(){} //uncomment this line for successful definition

Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.

virtual методы должны быть реализованы или определены как чистые.

Это похоже на методы не virtual без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:

struct X
{
    virtual void foo();
};
struct Y : X
{
   void foo() {}
};
int main()
{
   Y y; //linker error although there was no call to X::foo
}

Чтобы это сработало, объявите X::foo() чистым:

struct X
{
    virtual void foo() = 0;
};

Non- virtual

Некоторые члены должны быть определены, даже если они явно не используются:

struct A
{ 
    ~A();
};

Следующие ошибки приведут к ошибке:

A a;      //destructor undefined

Реализация может быть встроенной в самом определении класса:

struct A
{ 
    ~A() {}
};

или снаружи:

A::~A() {}

Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline, чтобы предотвратить множественное определение.

Все используемые методы-члены должны быть определены, если они используются.

Общей ошибкой является отказ от квалификации имени:

struct A
{
   void foo();
};

void foo() {}

int main()
{
   A a;
   a.foo();
}

Определение должно быть

void A::foo() {}

static. Члены данных должны быть определены вне класса в единственная единица перевода:

struct X
{
    static int x;
};
int main()
{
    int x = X::x;
}
//int X::x; //uncomment this line to define X::x

Инициализатор может быть предоставлен для элемента данных static const типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const данных.

8
задан Boris Burtin 16 November 2013 в 02:41
поделиться

2 ответа

Эта проблема связана с тем, как MySQL обрабатывает значения Null и h2. В основном MySQL преобразует нули, полученные в empty string/0, где, как и в h2, существует четкое различие между всеми тремя типами.

Итак, они (h2) решили преобразовать нули в 0 / пустую строку / текущую метку времени в режиме MYSQL. Но поскольку в качестве ядра h2 0 / пустая строка не являются нулями, поэтому она вставляет данные.

Используйте org.h2.engine.Mode и измените переменную, связанную с этим:

Mode mode = Mode.getInstance("MYSQL");
mode.convertInsertNullToZero = false;

Это сработало для меня. Благодаря этой ссылке.

7
ответ дан pinkpanther 31 August 2018 в 18:07
поделиться

Из H2: Режим совместимости MySQL :

При вставке данных, если столбец определен как NOT NULL и NULL вставлен, 0 (или пустая строка или текущая метка времени для столбцов временной отметки). Обычно эта операция не разрешена и генерируется исключение.

В руководстве по MySQL говорится: следующее в INSERT , без различия между MyISAM или InnoDB:

Вставка NULL в столбец, который был объявлен NOT NULL. Для операторов нескольких строк INSERT [..] в столбце задано неявное значение по умолчанию для типа данных столбца. [..] ( Для однострочного INSERT предупреждение не появляется, когда NULL вставлен в столбец NOT NULL. Вместо этого оператор с ошибкой выдает ошибку. )

Таким образом, я не знаю, почему, или откуда этот выбор был сделан H2.

3
ответ дан user2864740 31 August 2018 в 18:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: