Этот ответ был сделан pre-JPA2 реализациями при использовании JPA2 см. ответ ElementCollection выше:
Списки объектов в объекте модели обычно считают отношениями "OneToMany" с другим объектом. Однако Строка не является (отдельно) допустимым клиентом Связи "один ко многим", поскольку она не имеет идентификатора.
Так, Вы должны преобразовывать свой список Строк к списку объектов Argument-class JPA, содержащих идентификатор и Строку. Вы могли потенциально использовать Строку в качестве идентификатора, который оставит немного свободного места в Вашей таблице и от удаления поля ID и путем консолидации строк, где Строки равны, но Вы потеряли бы способность заказать аргументы назад в их первоначальный заказ (поскольку Вы не сохранили информации для заказа).
, С другой стороны, Вы могли преобразовать свой список в @Transient и добавить другое поле (argStorage) к Вашему классу, который является любой VARCHAR () или CLOB. Необходимо будет тогда добавить 3 функции: 2 из них являются тем же и должны преобразовать Ваш список Строк в единственную Строку (в argStorage) разграниченный способом, что можно легко разделить их. Аннотируйте эти две функции (что каждый делает то же самое) с @PrePersist и @PreUpdate. Наконец, добавьте третью функцию, которая разделяет argStorage на список Строк снова, и аннотируйте его @PostLoad. Это будет держать Ваш CLOB в курсе со строками каждый раз, когда Вы идете, чтобы сохранить Команду и держать argStorage поле в курсе перед хранением его к DB.
я все еще предлагаю делать первый случай. Это - хорошая практика для реальных отношений позже.
Ваш код эффективен, но неверен. (Рассмотрим {[false] = 0}
.) Правильный код -
if next(myTable) == nil then
-- myTable is empty
end
Для максимальной эффективности вам нужно привязать следующий
к локальной переменной, например,
...
local next = next
...
... if next(...) ...
Одна из возможностей - подсчитать количество элементов с помощью метатабельного ключа newindex. При назначении чего-либо, отличного от nil
, увеличивайте счетчик (счетчик также может находиться в метатаблице), а при назначении nil
уменьшайте счетчик.
Тестирование для пустой таблицы будет для проверки счетчика с 0.
Вот указатель на метатаблицу
Мне нравится ваше решение, и я, честно говоря, не могу предположить, что мое решение в целом быстрее.