Пустые конструкторы и методы set на JPA Entites

У меня недавно была очень похожая проблема в Windows, но в конце концов мне удалось выяснить, что вызывает чрезвычайно медленные сетевые соединения в Eclipse. На самом деле проблема не в низкой пропускной способности, а в тайм-аутах соединения . Решением в моем случае было отключить все ненужные сетевые адаптеры в Windows, такие как адаптеры Hamachi и TeamViewer. Я знаю, что вы работаете в Ubuntu, но я уверен, что корень проблемы в вашем случае очень похож.

13
задан 22 June 2009 в 14:02
поделиться

6 ответов

С DataNucleus вам не нужно добавлять конструктор по умолчанию, если вы не хотите; он будет добавлен автоматически при улучшении байт-кода. Также вы можете сохранять поля вместо свойств, поэтому нет необходимости в общедоступных установщиках.

- Энди ( DataNucleus )

1
ответ дан 1 December 2019 в 20:11
поделиться

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

Следующий код будет использовать прямой доступ к полю и будет работать как часть сущности без установщика:

@Column(name = DESCRIPTION)
private String description;

public String getDescription() { return description; }

По сравнению с доступом к методу с сеттером:

private String description;

@Column(name = DESCRIPTION)
public void setDescription(String description) {
     this.description = description;
}

public String getDescription() { return description; }
18
ответ дан 1 December 2019 в 20:11
поделиться

Просто сделайте свой конструктор защищенным или закрытым, чтобы сохранить инварианты классов!

public class Person {
 private String firstName;
 private String lastName;

 public Person(String firstName, String lastName) {
  setFirstName(firstName);
  setLastName(lastName);
 }

 // private no-arg constructor for hibernate.
 private Person() {

 }

 public String getFirstName() {
  return firstName;
 }
 public String getLastName() {
  return lastName;
 }

 // private setters for hibernate
 private void setFirstName(String nme) {
  firstName = nme;
 }
 private void setLastName(String nme) {
  lastName = nme;
 }
}

см. http://www.javalobby.org/java/forums/m91937279.html для получения подробной информации.

2
ответ дан 1 December 2019 в 20:11
поделиться

Да, сохранять поля вместо свойств, но если вы не хотите использовать конструктор по умолчанию, вы обычно (если только усилитель байт-кода не сделает какой-нибудь трюк) от этого не уйти .

Вы должны разрешить вашей реализации jpa создать экземпляр класса, поэтому общедоступный конструктор по умолчанию является обязательным.

0
ответ дан 1 December 2019 в 20:11
поделиться

OpenJPA может добавить аргумент без аргументов как часть улучшения ваших сущностей.

Насколько мы понимаем, это требование предусмотрено спецификацией JPA. В предыдущем ответе говорится, что вы можете сделать ctor no-arg закрытым, но это не соответствует спецификации (я вижу, что ссылка указывает на конкретную страницу Hibernate). В спецификации указано, что объект должен иметь открытый или защищенный аргумент без аргументов.

-Rick

3
ответ дан 1 December 2019 в 20:11
поделиться

На самом деле у вас должны быть оба конструктор no-args и методы получения и установки. Требования указаны в разделе 2.1 спецификации .

Требование конструктора no-arg находится на странице 17 в моей копии:

Класс объекта должен иметь no-arg конструктор. Класс сущности может иметь другие конструкторы. Без аргументов конструктор должен быть публичным или protected.

Страница 18 имеет требование для методов доступа:

Постоянное состояние объекта - представлен переменными экземпляра, что может соответствовать Java-Beans свойства. Переменная экземпляра может получить прямой доступ только изнутри методы сущности сам экземпляр объекта. Пример переменные не должны быть доступны для клиенты предприятия. Штат объект доступен клиентам только через аксессор сущности методы (методы получения / установки) или другие методы ведения бизнеса. Пример переменные должны быть закрытыми, защищенными, или видимость пакета.

Доступ к полю и к свойству указывает, как провайдер JPA взаимодействует с вашей сущностью, а не как клиентское приложение взаимодействует с ним. Клиент всегда должен использовать методы get и set.

Некоторые поставщики JPA более снисходительны к этим требованиям, и вы можете сделать конструктор закрытым (как предложено выше) у определенного поставщика. Однако приложение может быть непереносимым, поэтому вы можете быть удивлены, если мигрируете в будущем.

Поэтому я бы не рекомендовал полностью исключать методы. Чтобы решить эту проблему, я бы пометил общедоступный no-arg ctor как устаревший (поместите что-нибудь в javadoc о том, что он предназначен только для использования поставщиком JPA). Установленные методы могут содержать логику, которую вы хотите поддерживать для своих инвариантов.

Это не ' t идеально, но он должен предотвратить случайное использование неправильного ctor (я предполагаю, что у вас есть ctor, который устанавливает инварианты).

7
ответ дан 1 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

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