没加@Temporal注解前,删除表格,可以在删除表的情况下运行项目,这样它会自动创建一个这样的表

第一步,关于实体类Customer,增加了两个Date
//关联数据表
@Table(name="jpa_customers")
//持久化类
@Entity
public class Customer {
@Id//标明是主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//设置主键生成策略
private Integer id;
@Column(name = "last_name")
private String lastName;
private String email;
private int age;
private Date createdTime; //Date为java.util.Date
private Date birth;
//省略get和set
第二步,运行测试方法
@Test
public void testSave(){
//创建一个实体管理器工厂EntityManagerFactory
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
//从工厂中获取实体类管理器 EntityManager
EntityManager manager = factory.createEntityManager();
//获取事务并开启
EntityTransaction tx = manager.getTransaction();
tx.begin();
//创建实体
Customer customer = new Customer();
customer.setAge(12);
customer.setEmail("12345@qq.com");
customer.setLastName("tom");
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
//调用manager的方法,保存该对象信息
manager.persist(customer);
//提交事务
tx.commit();
//关闭manager
manager.close();
//关闭factory
factory.close();
}
第三步,生成的表格数据,发现时间精确到秒,但生日不需要精确到秒,因此需要加上@Temporal注解

第四步,观察表结构,发现java中的Date类型对应数据库中的datetime类型

实体类加上@Temporal注解后
//关联数据表
@Table(name="jpa_customers")
//持久化类
@Entity
public class Customer {
@Id//标明是主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//设置主键生成策略
private Integer id;
@Column(name = "last_name")
private String lastName;
private String email;
private int age;
@Temporal(TemporalType.TIMESTAMP)
private Date createdTime; //Date为java.util.Date
@Temporal(TemporalType.DATE)
private Date birth;
//省略getter和setter
删除表,重新运行项目后,表中数据变为

表结构变为,其中birth的类型变为了date类型

在核心的 JavaAPI 中并没有定义Date类型的精度(temporalprecision). 而在数据库中,表示Date类型的数据有DATE,TIME, 和 TIMESTAMP三种精度(即单纯的日期,时间,或者两者兼备). 在进行属性映射时可使用@Temporal注解来调整精度
本文详细介绍了在Java实体类中使用@Temporal注解的背景和目的。通过实例展示了未添加@Temporal注解时,Date类型字段默认存储为datetime类型,精确到秒。而添加@Temporal注解后,可以将日期精度调整为date类型,适用于只需要日期部分的场景。文章还提及了数据库中Date类型的不同精度,并讨论了@Temporal注解在数据库表结构映射中的影响。
259

被折叠的 条评论
为什么被折叠?



