JPA дата не совпадает с датой Oracle после сохранения - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующая таблица оракулов ..

create table post (id number(10,0) not null, text varchar2(255 char), title varchar2(255 char), update_date date, version number(10,0), primary key (id));

Моя сущность выглядит примерно так ..

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Post {

    @Id Integer id;
    String title;
    String text;
    @LastModifiedDate @Temporal(TemporalType.TIMESTAMP) Date updateDate;
    @Version Integer version;
    ....
}

Хранилище это просто ...

public interface PostRepository extends JpaRepository<Post, Integer>{

}

Следующий тест не пройден ...

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostRepositoryTest {

    @Autowired protected JdbcTemplate jdbcTemplate;
    @Autowired PostRepository postRepo;

    private static final Integer TEST_POST_ID = -1;
    private static final String TEST_TEXT = "This is the text.";

    @Before
    public void setup() {
        String insertPostSql = "insert into POST (ID, TITLE, TEXT, UPDATE_DATE, VERSION) values (?, ?, ?, ?, ?)";
        jdbcTemplate.update(insertPostSql, new Object[]{TEST_POST_ID, "Title 1.", TEST_TEXT, new Date(), 0});
    }

    @After
    public void teardown() {
        String deletePostSql = "delete from POST where ID = ?";
        jdbcTemplate.update(deletePostSql, new Object[]{TEST_POST_ID});
    }   

    @Test
    public void testUpdateA() throws Exception {
        Post post = postRepo.findById(TEST_POST_ID).get();
        post.setTitle(TEST_TEXT+" Amendment.");
        Post updatedPost = postRepo.save(post);
        assertNotEquals(post.getVersion(), updatedPost.getVersion());
        Post updatedPost2 = postRepo.save(updatedPost);
        assertEquals(updatedPost.getVersion(), updatedPost2.getVersion());
    }

}

Второе обновление объекта сохраняется в базе данных, даже если ничего не изменилось.Если я изменю тип столбца даты обновления в базе данных на TIMESTAMP, тест пройден успешно.К сожалению, я не могу этого сделать, есть ли что-то еще, что я могу сделать, так как дата в возвращенном экземпляре из вызова сохранения не равна дате в базе данных в соответствии с грязной проверкой JPA.Заранее спасибо.

1 Ответ

0 голосов
/ 17 декабря 2018

Чтобы решить эту проблему, я реализовал собственный метод @PreUpdate вместо использования @LastModifiedDate, и в этом методе я установил дату обновления для экземпляра метки времени и установил нано-секунды равными 0.

@PreUpdate
public void onPreUpdate(Post post){
    Timestamp ts = new Timestamp(System.currentTimeMillis()); ts.setNanos(0);
    post.setUpdateDate(ts);     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...