2013-08-21 3 views
1

최대 절전 모드 구현에서 JPA를 사용하고 있습니다. 다음과 같이 은 내가 @Entity 트랜잭션이 : 나는 새로운 트랜잭션을 생성 할 때JPA 필드 타임 스탬프가 업데이트되지 않습니다.

@Entity 
public class Transaction { 

    private int id; 
    private Date timestamp; 

    ... 

    @Basic 
    @Column(name = "timestamp", insertable = false, updatable = true) 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(Date timestamp) { 
     this.timestamp = timestamp; 
    } 

    ... 

    @Column(name = "id") 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "transaction_id_seq") 
    @SequenceGenerator(name = "transaction_id_seq", sequenceName = "transaction_id_seq", allocationSize = 1) 
    public int getId() { 
     return id; 
    } 

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


} 

내가 idtimestamp 필드를 설정하지 않고 나는 persist()

PersistenceProvider pp = new HibernatePersistence(); 
EntityManagerFactory emf = pp.createEntityManagerFactory("pu", new HashMap()); 
EntityManager em = emf.createEntityManager(); 

Transaction t = new Transaction(); 

em.getTransaction().begin(); 
em.persist(t); 
em.getTransaction().commit(); 
를 사용하여 DB에 저장

이 코드를 실행 한 후 트랜잭션 내부의 id은 DB에 의해 자동 생성되지만 타임 스탬프는 null입니다.

persist()라고하면 timestamp도 개체에 반환되는 방식으로 thigs를 만들 수 있습니까?

+0

나는 Postgresql을 사용하는데 타임 스탬프가 now() 함수를 사용하여 데이터베이스에 의해 생성 된 것이라고 명시하지 않았습니다. – hurtledown

답변

2

TemporalType.TIMESTAMP 어떻게 당신이 기대에 다르게 작용 감사합니다.

레코드가 생성 될 때 현재 시간 소인이 열에 자동으로 삽입되지 않습니다. 데이터베이스에서 저장할 날짜의 정보를 간단히 설명합니다. JPA는 AFAIK 기능을 지원하지 않습니다. 당신은 내가 찾고있는 기능을

는 업데이트에 대한 값을 변경하려면

CREATE TABLE `Transaction` (
    ... 
    `timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
) 

documentation에서보세요 MySQL은 디폴트 값으로 현재 시간과 열을 만들어 지원하는 것을 알고 역시.

오라클을 사용하는 경우 트리거를 제안합니다.

CREATE TRIGGER <trigger_name> BEFORE INSERT ON Transaction FOR EACH ROW SET NEW.timestamp = CURRENT_TIMESTAMP; 

그렇지 않으면 트랜잭션 개체의 timestamp 필드를 수동으로 초기화해야 지속됩니다.

+0

감사합니다.하지만 문제는 db에 의해 올바르게 수행 된 타임 스탬프의 생성이 아닙니다. 문제는 자동으로 검색되지 않는다는 것입니다. – hurtledown

+0

시도해보십시오 em.refresh (t) – maxmil

+0

예 :) 작동했습니다, 감사합니다 !!! – hurtledown

관련 문제