SpringData Manytomany 中间表添加额外字段
Course跟user是两张多对多关联表
//省略部分不相关代码以及getter跟setter
/**
* 课程列表
*/
@ApiModelProperty(hidden = true)
//放弃延时加载,改为立即加载
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(name = "t_user_course",
joinColumns = {@JoinColumn(name="user_id",referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name="course_id",referencedColumnName = "id")}
)
private List<Course> courses = new ArrayList<>();
课程表内容
//省略部分不相关代码以及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 '购买时间")
可以设置默认值、可以生成注释