2009-11-12 1 views
17

여러분 덕분에 내 절전 모드에서의 knowlegde가 dratiscally 개선되었습니다. 이제 current_timestamp에 대해 여기 블록을 클릭합니다. 내가 CURRENT_TIMESTAMP를 얻을 DATE_CREATED 원하고 내가 각 시간을 삽입 할 LASTMODIFIED이 updates.apparently 내가 거기에 같은 table.Is 다른 방법으로 2 개 CURRENT_TIMESTAMP 필드를 가질 수 없습니다 원하는최대 절전 모드 JPA 주석을 사용하여 자동 생성 시간을 설정하는 것

@Column(name="DATE_CREATED", insertable=false, updatable=false, columnDefinition="timestamp default current_timestamp") 
@org.hibernate.annotations.Generated(value=GenerationTime.INSERT) 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
private Date dateCreated; 

@Column(name="LAST_MODIFIED", insertable=false, updatable=false, columnDefinition="datetime") 
@org.hibernate.annotations.Generated(value=GenerationTime.ALWAYS) 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
private Date lastModified; 

여기 내 코드입니다 달성하기 위해? 읽기를위한 감사합니다

답변

47

이것은 최대 절전 모드 자체와 관련이 없습니다. 위에 명시된 것과 같은 주석은 Hibernate에게 값이 데이터베이스에 의해 생성 될 것이라는 것을 알려주기 때문에 엔티티가 삽입/갱신 된 후에 다시로드 될 필요가있다.

원하는 방식이라면 데이터베이스를 구성하여 (예 : 트리거를 만들어서) 필요에 따라 date_created/last_modified 개의 열을 채워야합니다.

또 다른 방법은 생성 된 필드를 표시하지 않고 Java 코드에서 필드를 업데이트하는 것입니다. ChssPly76 @

@PreUpdate 
@PrePersist 
public void updateTimeStamps() { 
    lastModified = new Date(); 
    if (dateCreated==null) { 
     dateCreated = new Date(); 
    } 
} 
+0

: 당신이 (최대 절전 모드 EntityManager를 통해) JPA를 사용하는 경우, 그것은 @PrePersist/@PreUpdate 콜백 메소드를 통해이 작업을 수행하기보다는 사소한 이유 그는 같은 테이블에서 2 current_timestamps을 가질 수 없습니다, 나도 몰라 이것은 최대 절전 모드 제한이 될 것이며 응답에서 그렇게 생각하지는 않습니다. 따라서 비즈니스/dba 제한이되어야합니다 ("분명히 가질 수 없습니다 ..."라는 말은 그가 그 주현에 놀랐던 것처럼 들립니다). EM을 사용할 수 없다면 무엇을 그의 수단으로 사용할 수 있을까요? –

+0

Hibernate는 상관하지 않는다; 그것은 데이터베이스 한계입니다 - MySQL은 정확합니다. 나는 그들이 왜 이것을 허용하지 않는지 전혀 모른다. 아마도 타임 스탬프가 항상 같을 것이라고 생각했기 때문일 수 있습니다. – ChssPly76

+1

ms SQL 서버의 경우 타임 스탬프는 datetime과 완전히 다른 것을 의미하며 배수가있는 것은 의미가 없습니다. – ashirley

관련 문제