Будьте в спящем режиме/персистентность без @Id

Ответ Хармена довольно хороший, но позвольте мне немного рассказать о том, где это делается компилятором 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 самостоятельно - если вы используете два отдельных тега

3 ответа

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

Есть несколько разных подходов:

@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

26
ответ дан 27 November 2019 в 22:40
поделиться

Для каждой сущности необходимо указать по крайней мере одно из следующего:

  • один @Id
  • несколько @Id и @IdClass (для составного первичного ключа)
  • @EmbeddedId

, может быть, вы сможете создать составной первичный ключ, содержащий несколько полей?

6
ответ дан 27 November 2019 в 22:40
поделиться

Вы можете проверить наличие логического идентификатора и соответственно предоставить информацию о сопоставлении. Hibernate не будет проверять базу данных на наличие определенного первичного ключа.

0
ответ дан 27 November 2019 в 22:40
поделиться
Другие вопросы по тегам:

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