2016-06-16 2 views
0

Я использую Hibernate и JPAУстановить поле, когда Hibernate получить объект из базы данных

У меня есть некоторый POJO

public class Pojo { 
    @Temporal(TemporalType.DATE) 
    private Date date; 
    @Transient 
    private long dLong; 
    //other fields 
    //getters and setters 
} 

Я хочу, чтобы преобразовать date в dLong, когда я получаю объект Pojo из базы данных. я могу это сделать, когда у меня есть объект

Pojo pojo = repository.findFirst(); 
Date date = pojo.getDate(); 
long l = date.getTime(); 
pojo.setDLong(l); 

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


Редактировать Главное содержание - пример. Извините, но я не могу объяснить свою проблему на примере. Теперь я показать свой Orignal код:

@Entity 
public class Medicament { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    private String name; 

    @Transient 
    private long date; 

    @Temporal(TemporalType.DATE) 
    private Date dateExpiration; 

    //getters and setters 
} 

рядом я есть службы

@Service 
public class MedicamentService { 

    @Autowired 
    private MedicamentRepositoryEntityGraph medicamentRepositoryEntityGraph; 

    public Medicament findById(int id) { 
     return medicamentRepositoryEntityGraph.getOne("select m from Medicament m where m.id="+id, "user", "disease"); 
    } 
} 

и хранилище

@Repository 
public class MedicamentRepositoryEntityGraph { 

    @Autowired 
    private EntityManager entityManager; 

    public Medicament getOne(String query, String...param) { 
     EntityGraph<Medicament> entityGraph = template(param); 
     Medicament medicament = entityManager.createQuery(query, Medicament.class) 
      .setHint("javax.persistence.loadgraph", entityGraph) 
      .getSingleResult(); 
     return medicament; 
    } 

    private EntityGraph<Medicament> template(String... param) { 
     EntityGraph<Medicament> entityGraph = entityManager.createEntityGraph(Medicament.class); 
     entityGraph.addAttributeNodes(param); 
     Map<String, Object> hints = new HashMap<String, Object>(); 
     hints.put("javax.persistence.fetchgraph", entityGraph); 
     return entityGraph; 
    } 

} 

хранить в базе данных dateExpiration, но когда я получаю из базы данных I 'Medicament' хотите конвертировать 'dateExpiration' в длинную 'дату', когда я использую метод findById от службы MedicamentService

Я пытался использовать геттер и сеттер, но безуспешно:

public void setDateExpiration(Date dateExpiration) { 
     this.dateExpiration = dateExpiration; 
     this.date = dateExpiration.getTime(); 
    } 
+0

Почему бы вам просто не предоставить getter, который возвращает 'date.getTime()'? Что такое 'repository.findFirst()' - пользовательская реализация? И является ли «Pojo» сущностью или создан с помощью синтаксиса конструктора Hibernate? – Thomas

+0

Я добавил некоторую информацию к основному вопросу. Это мои первые сообщения о stackoverflow и у меня вопрос, вы получили сообщение, что я отредактировал мой вопрос? –

+0

Нет, нет уведомления, если вы отредактируете свой вопрос. – Thomas

ответ

0

Hibernate может обойти сеттеры, но вы могли бы сделать dLong «виртуальное» свойство, например, как это:

public long getDate() { 
    if(dateExpiration == null) { 
    return -1; 
    } 

    return dateExpiration.getTime(); 
} 

//Be careful with that and add some documentation 
public void setDate(long date) { 
    dateExpiration = new Date(date); 
} 

В качестве альтернативы можно отобразить date в том же столбце dateExpiration и добавьте insertable = false, updatable = false к @Column, но вы, возможно, придется добавить пользовательский тип пользователя, чтобы преобразовать дату DB долго.

+0

Я не могу использовать «виртуальное» свойство, потому что я отталкиваю объект, чтобы посмотреть, где я использую свойство date как долго. –

+0

@ TomaszMolenda в зависимости от вашей структуры вы все равно можете это сделать, например. если он основан на спецификации Java Beans. – Thomas

Смежные вопросы