Как сохранить объект, содержащий поле типа пользователя, с помощью JPA2

StackOverflow https://stackoverflow.com/questions/2492160

  •  21-09-2019
  •  | 
  •  

Вопрос

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

import org.joda.time.DateTime;

@Entity
public class Foo {

  @Id
  private Long id;

  private DateTime ts;
}
Это было полезно?

Решение

JPA не имеет возможности регистрировать пользовательские типы свойств, вам придется использовать специфичные для поставщика материалы:

Другие советы

Поскольку это не поддерживаемый тип, определенный JPA, вы полагаетесь на особенности реализации.У DataNucleus есть плагин для JodaTime, который обеспечит желаемое постоянство.

Либо вы можете использовать эти специфичные для поставщика материалы, либо вы можете использовать @PostPersist, @PostUpdate, @PostLoad методы обратного вызова с суррогатом @Transient поле.

http://www.java2s.com/Tutorial/Java/0355__JPA/EntityListenerPostLoad.htm даст вам некоторое представление.

Пожалуйста, свяжитесь с нами для получения дополнительных разъяснений.

Одним из решений является использование свойств, не являющихся столбцами, и инкапсуляция их с помощью геттеров/сеттеров.

Чтобы указать JPA использовать геттеры/сеттеры вместо прямого доступа к частным полям, вы должны аннотировать @Id на общедоступный длинный getId() вместо частный длинный идентификатор.При этом не забудьте использовать @Transient для каждого метода получения, который не соответствует непосредственно столбцу.

В следующем примере будет создан столбец даты с именем мое свидание, в то время как приложению будут доступны методы DateTime getTs() и setTs().(не уверен насчет DateTime API, поэтому простите за мелкие ошибки :))

import org.joda.time.DateTime;

@Entity
public class Foo {

  private Long id;

  private DateTime ts;

  @Id
  public Long getId() { return id; }

  public void setId(Long id) { this.id = id; }



  // These should be accessed only by JPA, not by your application;
  // hence they are marked as protected

  protected Date getMyDate() { return ts == null ? null : ts.toDate(); }

  protected void setMyDate(Date myDate) {
    ts = myDate == null ? null : new DateTime(myDate);
  }



  // These are to be used by your application, but not by JPA;
  // hence the getter is transient (if it's not, JPA will
  // try to create a column for it)

  @Transient
  public DateTime getTs() { return ts; }

  public void setTs(DateTime ts) { this.ts = ts; }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top