2010-06-22 2 views
0

В одном из моих классов спящего режима у меня есть переменная Timestamp. Теперь все было в порядке, когда я использовал только спящий режим на сервере. Но теперь я реализую webservice с wsgen.JAVA hibernate/webservice - проблема с отметкой времени

Я получаю сообщение об ошибке, потому что Timestamp не имеет конструктора по умолчанию no-args.

Сообщение;

Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
java.sql.Timestamp does not have a no-arg default constructor. 

Класс:

package com.PTS42.planner; 

import java.io.Serializable; 
import java.sql.Timestamp; 
import javax.jws.WebParam; 
import javax.jws.WebService; 
import javax.persistence.*; 
import org.hibernate.annotations.GenericGenerator; 

@WebService 
@Entity @Table(name="Reserveringen") 
public class Reservering implements Serializable { 

    @Id @GenericGenerator(name = "generator", strategy = "increment") 
    @GeneratedValue(generator = "generator") 
    private int id; 

    private Timestamp vanaf; 

    private Timestamp tot; 

    @ManyToOne 
    @Embedded 
    private Klant klant; 

    @ManyToOne 
    @Embedded 
    private Machine machine; 

    public int getId() { 
     return id; 
    } 

    public void setId(@WebParam(name="reservering_id")int id) { 
     this.id = id; 
    } 

    public Klant getKlant() { 
     return klant; 
    } 

    public void setKlant(@WebParam(name="reservering_klant")Klant klant) { 
     this.klant = klant; 
    } 

    public Timestamp getTot() { 
     return tot; 
    } 

    public void setTot(@WebParam(name="reservering_tot")Timestamp tot) { 
     int tempint = tot.getMonth(); 
     tot.setMonth(tempint-1); 
     this.tot = tot; 
    } 

    public Timestamp getVanaf() { 
     return vanaf; 
    } 

    public void setVanaf(@WebParam(name="reservering_vanaf")Timestamp vanaf) { 
     int tempint = vanaf.getMonth(); 
     vanaf.setMonth(tempint-1); 
     this.vanaf = vanaf; 
    } 

    public Machine getMachine() { 
     return machine; 
    } 

    public void setMachine(@WebParam(name="reservering_machine")Machine machine) { 
     this.machine = machine; 
    } 




    public Reservering() { 
    } 

    public Reservering(@WebParam(name="reservering_constructor_vanaf") Timestamp vanaf, @WebParam(name="reservering_constructor_tot")Timestamp tot, @WebParam(name="reservering_constructor_klant")Klant klant, @WebParam(name="reservering_constructor_machine")Machine machine) 
    { 

     this.vanaf = vanaf; 
     this.tot = tot; 
     this.klant = klant; 
     this.machine = machine; 
    } 



} 

Кто знает, как решить эту проблему, не используя другой вид переменной затем Timestamp.

+0

ли ваша потребность класса Hibernate иметь переменную Timestamp? Временная метка - это оболочка, специфичная для SQL, вокруг java.util.Date. Если вам не нужны наносекунды, то вам, вероятно, не нужна отметка времени, и вы можете просто использовать Date напрямую. Как правило, считается неправильной формой для выявления типов, специфичных для SQL, за пределами уровня базы данных, но я не уверен, что изменение класса Hibernate действительно для этого назначения. – Jeff

+0

Когда я использую дату в моем спящем объекте. И поместив его в базу данных, время datetime в базе данных mysql не занимает времени (часы и минуты) с ним. – Julian

+0

Используете ли вы аннотации Hibernate для отображения сущности? Если это так, вы можете настроить точность в БД с помощью аннотации @Temporal (TemporalType.TIMESTAMP) – Jeff

ответ

1

Я не уверен, почему вы против использования чего-то другого, кроме отметки времени. Следующий код даст вам ту же структуру базы данных и не пытается выставить класс SQL, где не имеет бизнеса подвергаясь класс SQL:

package com.PTS42.planner; 

import java.io.Serializable; 
import java.util.Date 
import javax.jws.WebParam; 
import javax.jws.WebService; 
import javax.persistence.*; 
import org.hibernate.annotations.GenericGenerator; 

@WebService 
@Entity @Table(name="Reserveringen") 
public class Reservering implements Serializable { 

    @Id @GenericGenerator(name = "generator", strategy = "increment") 
    @GeneratedValue(generator = "generator") 
    private int id; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date vanaf; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date tot; 

    @ManyToOne 
    @Embedded 
    private Klant klant; 

    @ManyToOne 
    @Embedded 
    private Machine machine; 

    public int getId() { 
     return id; 
    } 

    public void setId(@WebParam(name="reservering_id")int id) { 
     this.id = id; 
    } 

    public Klant getKlant() { 
     return klant; 
    } 

    public void setKlant(@WebParam(name="reservering_klant")Klant klant) { 
     this.klant = klant; 
    } 

    public Date getTot() { 
     return tot; 
    } 

    public void setTot(@WebParam(name="reservering_tot")Date tot) { 
     //int tempint = tot.getMonth(); 
     //tot.setMonth(tempint-1); 
     this.tot = tot; 
    } 

    public Date getVanaf() { 
     return vanaf; 
    } 

    public void setVanaf(@WebParam(name="reservering_vanaf")Date vanaf) { 
     //int tempint = vanaf.getMonth(); 
     //vanaf.setMonth(tempint-1); 
     this.vanaf = vanaf; 
    } 

    public Machine getMachine() { 
     return machine; 
    } 

    public void setMachine(@WebParam(name="reservering_machine")Machine machine) { 
     this.machine = machine; 
    } 

    public Reservering() { 
    } 

    public Reservering(@WebParam(name="reservering_constructor_vanaf") Date vanaf, @WebParam(name="reservering_constructor_tot")Date tot, @WebParam(name="reservering_constructor_klant")Klant klant, @WebParam(name="reservering_constructor_machine")Machine machine) 
    { 

     this.vanaf = vanaf; 
     this.tot = tot; 
     this.klant = klant; 
     this.machine = machine; 
    } 
} 
+0

Просто попробовал это, но теперь нет времени в базе данных mysql. И после того, как я попробовал что-то, мой день отправился в: 12/14/3910 8:10:00 PM Thats 1900 лет выше того, что я просил. – Julian

+0

Можете ли вы отлаживать свой код, чтобы увидеть, где дата перепуталась? Мое предположение было бы на уровне веб-сервиса. Если это так, вы можете попробовать сопоставить поля как объекты Calendar. Поля календаря (с аннотацией @Temporal) ДОЛЖНЫ все еще играть хорошо с Hibernate, и они, вероятно, лучший выбор для сериализации веб-сервисов. – Jeff

+0

Получил работу !!! Когда я создаю объект Reservering, я заполняю дату с помощью calendar.getTime(). GetTime(). Исправлено: – Julian

1

вам нужно будет создать пользовательский ИАС/unmarshaller для этого типа, так как она не имеет конструктора без аргументов, который необходим в wsgen (@XmlJavaTypeAdapter)

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

+0

Я действительно не знаю, как это сделать, вроде ненавижу java, но это задание так. В любом случае вы знаете, есть ли что-нибудь подобное? – Julian

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