课程表内容
//省略部分不相关代码以及getter跟setter @ManyToMany(mappedBy = "courses") private Set<User> users = new HashSet<User>();中间表UserCourse内容
package com.fuju.pojo; import java.sql.Timestamp; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.Generated; import org.hibernate.annotations.GenerationTime; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; /** * 用户课程中间表 * @author Administrator * */ @Entity @Table(name = "t_user_course") @EntityListeners(AuditingEntityListener.class) public class UserCourse { //省略getter跟setter /** * 主键ID */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column private Integer id; /** * 创建时间(中间表额外字段) */ @Column(name = "createTime",columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP",updatable = false,nullable = false) @Generated(GenerationTime.INSERT) private Timestamp createTime; }由于中间表的数据是自动插入的,一开始采用的是如下方法添加创建时间
/** * 创建时间 */ @CreatedDate @Column(name = "createTime",updatable = false,nullable = false) private Date createTime;以上方式存在问题 插入数据的时候执行的是如下语句 Hibernate: insert into t_user_course (user_id, course_id) values (?, ?) 插入的时候并没有给createTime赋值,导致系统报错
注解@org.hibernate.annotations.Generated来标识一个已生成属性 GenerationTime的可用的设置选项是ALWAYS和INSERT 当使用ALWAYS的时候,Hibernate每次执行SQL UPADATE或者INSERT插入的时候就会刷新实体 使用GenerationTime.INSERT,只会在SQL INSERT的时候出现,来获取数据库的默认值 属性也应该标识为只读,只读属性使用注解@Column的updatable和insertable来实现
如果两个都设置了false,属性列表就用于不会在INSERT或者UPADATE语句中出现了,这些列的数值就由数据库来产生值 @ColumnDefault属性注解,设置列表的默认属性,当hibernate导出和生成SQL schenma DDL的时候 @Temporal注解来声明映射的SQL数据类型,如果使用了converter转换器之后,注解是不需要了 @Column(columnDefinition="timestamp default current_timestamp comment '购买时间")可以设置默认值、可以生成注释