Ответ Хармена довольно хороший, но позвольте мне немного рассказать о том, где это делается компилятором CoffeeScript и почему.
Когда вы что-то компилируете с помощью coffee -c foo.coffee
, вы всегда получите foo.js
, который выглядит следующим образом:
(function() {
...
}).call(this);
Почему это так? Хорошо, предположим, что вы поставили назначение, например
x = 'stringy string'
в foo.coffee
. Когда он видит это, компилятор спрашивает: существует ли x
в этой области или внешней области? Если нет, он помещает объявление var x
в начало этой области в выводе JavaScript.
Теперь предположим, что вы пишете
x = 42
в bar.coffee
, компилируете и объединяете foo.js
с bar.js
для развертывания. Вы получите
(function() {
var x;
x = 'stringy string';
...
}).call(this);
(function() {
var x;
x = 42;
...
}).call(this);
Таким образом, x
в foo.coffee
и x
в bar.coffee
полностью изолированы друг от друга. Это важная часть CoffeeScript: Переменные никогда не просачиваются из одного файла .coffee в другой, если явно не экспортированы (при подключении к общему глобальному файлу или к exports
в Node.js).
Вы можете переопределить это, используя флаг -b
(«bare») для coffee
, но это следует использовать только в очень особых случаях. Если бы вы использовали его в приведенном выше примере, вы получите результат
var x;
x = 'stringy string';
...
var x;
x = 42;
...
. Это может иметь ужасные последствия. Чтобы проверить это самостоятельно, попробуйте добавить setTimeout (-> alert x), 1
в foo.coffee
. И обратите внимание, что вам не нужно объединять два файла JS самостоятельно - если вы используете два отдельных тега для включения их на страницу, они все равно эффективно работают как один файл.
Изолируя области действия разных модулей, компилятор CoffeeScript избавляет вас от головной боли от беспокойства о том, могут ли разные файлы в вашем проекте использовать одни и те же имена локальных переменных. Это обычная практика в мире JavaScript (см., Например, источник jQuery или почти любой плагин jQuery) - CoffeeScript просто позаботится об этом за вас.
Если существует комбинация столбцов, которая делает строку уникальной, смоделируйте класс первичного ключа на основе комбинации столбцов. Если нет, то вам в основном не повезло, но вам следует пересмотреть дизайн представления, поскольку он, вероятно, не имеет смысла.
Есть несколько разных подходов:
@Entity
public class RegionalArticle implements Serializable {
@Id
public RegionalArticlePk getPk() { ... }
}
@Embeddable
public class RegionalArticlePk implements Serializable { ... }
Или:
@Entity
public class RegionalArticle implements Serializable {
@EmbeddedId
public RegionalArticlePk getPk() { ... }
}
public class RegionalArticlePk implements Serializable { ... }
Подробности здесь: http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#d0e1517
Вот сообщение, в котором описывается похожая проблема: http://www.theserverside.com/discussions/thread.tss?thread_id=22638
Для каждой сущности необходимо указать по крайней мере одно из следующего:
, может быть, вы сможете создать составной первичный ключ, содержащий несколько полей?
Вы можете проверить наличие логического идентификатора и соответственно предоставить информацию о сопоставлении. Hibernate не будет проверять базу данных на наличие определенного первичного ключа.