2014-09-08 3 views
1

저는 MySQL에 데이터베이스를 가지고 있고 1 열에 24 시간보다 더 많은 시간과 분, 초를 저장하고 싶습니다. 날짜와 관련이 없습니다.JPA를 통해 MySQL에 시간을 저장하십시오.

MySQL을 몇 가지 연구를하고 후에 내가 저장하려고하면 컬럼에 가장 적합한 유형 내가 열 유형 테이블을 나타내는 엔티티를 생성 한 자바에서는 TIME

java.sql.Time

입니다 수로 결정 예를 들어 192 시간 동안 나는 new Time((stf.parse("192:00:00")).getTime())을 사용하고 있지만 이것이 작동하지 않습니다.

더 좋은 방법이 있을까요, 아니면 시간을 절약 할 수있는 다른 방법이 있습니까? 지금 Entity 클래스가 올바른지 확인하기 위해 테스트를 작성 중이므로 NamedQueries 또는 엔티티 관리자를 사용하지 않는 이유가 무엇인지 확인하십시오.

내 엔티티 클래스 뺀 생성자와 게터/세터

@Entity 
@Table(name="hourslog", uniqueConstraints= {@UniqueConstraint(columnNames="idLog")}) 
public class HrsLog { 

@Id 
@GeneratedValue 
@Column(unique=true, nullable=false, updatable=false) 
private int idLog; 

@ManyToOne(cascade=CascadeType.PERSIST, fetch=FetchType.LAZY) 
@JoinColumn(name="idUser", nullable=false, updatable=false) 
private User user; 

@Column(nullable=false) 
private Timestamp startDate; 

@Column(nullable=false) 
private Timestamp endDate; 

@Column(nullable=false) 
private Time hrs; 


} 

전화 엔티티 생성자 및 dB로 저장

테스트를 실행하지만 DB의 열이 나타날 때 오류가 표시되지 않습니다
private static void createHrsLog() { 

    Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 

    /* 
    * Get user from db 
    */ 


    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
    SimpleDateFormat stf = new SimpleDateFormat("HH:mm:ss"); 

    HrsLog hrs; 
    try { 
     hrs = new HrsLog(user, new Timestamp((sdf.parse("01-01-2014 00:00:00")).getTime()), new Timestamp((sdf.parse("31-12-2014 23:59:59")).getTime()), new Time((stf.parse("192:00:00")).getTime())); 

     session.save(hrs); 
     session.getTransaction().commit(); 
    } catch (ParseException e) { 
     System.err.println("Error in time formatting"); 
     e.printStackTrace(); 
    } 

} 

00:00:00으로 표시되지 않습니다. 192:00:00이 예상 값입니다.

이 경우 사용자 수를 저장하고 싶습니다. 예를 들어 시작 날짜와 종료 날짜 사이에 로그인해야합니다. java.sql.Time는 밀리 초 정밀, 특정의 시점을 나타내는 java.util.Date 클래스 주위에 그냥 얇은 래퍼이기 때문에

+0

* 시간 수가 24 시간보다 길고 날짜와 관련이없는 * 이유로 'TIME'을 사용하는 이유 *? –

+3

무엇이 잘못 되었습니까? 정수입니까? – nablex

+0

@nablex 나는'INT'를 사용하려고 생각했으나 42Hrs와 40min을 저장하고 싶다면 10 진수로 변환해야하고'FLOAT'를 사용하면 40 분이 0.666이므로 반드시 정확하지는 않습니다. ... –

답변

3

당신은 데이터베이스에 00:00:00를 얻을. 그리고 하루에 24 시간 만 있습니다. 따라서 00:00:00에서 23:59:59까지의 값을 java.sql.Time에 저장할 수 있습니다.

(new Time((stf.parse("192:00:00")).getTime()) ->192 % 24 = 0-193:00:00으로 예를 시도하고 당신은 데이터베이스에 01:00:00을 확인할 수 있습니다.)

가 데이터베이스에 시간을 저장 long 유형을 사용하고 더 정밀도를 필요로하는 경우 (초 또는 밀리 초 단위로 시간을 변환하려면). 그것은 매우 쉬운 변환이며 어쨌든 시간이 지남에 따라 일부 논리를 수행 할 때이 방법을 사용하는 것이 좋습니다.

+0

왜 downvote입니까? 뭔가 잘못이다? –

+0

는 나에게서 나 아니야 ... 나는 그것을 시험해 볼 것이다! –

+0

@ L. 영 : 환영합니다. –

0

필자는 열을 Time 열로 유지했지만 JPA 엔티티 필드를 String으로 변경하여 완벽하게 작동했습니다. 이 사람 :

@Column(name="some_time_duration") 
private Time someTimeDuration; 

@Column(name="some_time_duration") 
private String someTimeDuration; 

에 나는 JPA 2.0와 MySQL 5.6을 사용하고 있습니다. 아마도 숫자를 저장하는 것이 더 나을 것입니다. 그러나 이것은 비 기술 유형이보고있는 스크래치 테이블이며 select *보다 foo에서 더 이상 알지 못해도 시간을 볼 수있는 빠른 방법입니다.

그러나 위의 대답에 동의합니다. 스키마를 제어하고 데이터가 비즈니스 데이터 또는 운영에 중요한 의미를 갖는 경우, 나는 오랫동안 사용할 것입니다.

관련 문제