自从用了jpa简单的crud在也没写过。。。手动狗头 这里记一下 在使用JPA时遇到的坑。
JPA爬坑
1.entity设置默认值
jpa注解设置默认值用到的注解是@Column。
但有一个问题就是,如果你已经建立好了表,然后在加上@Column(insertable = false,columnDefinition = “int default 1”)是没有用的,因为这个注解只有在建表时才会起作用,也就是说,如果DB中表已经建好,该属性没有必要使用
@Column(columnDefinition=“int default 1”,nullable=false)
private int number;
/**所以最好是在save()或者update()写入时增加逻辑操作
或者
去掉注解 直接 赋予默认值**/
private int number = 1 ;
2.JPA字段驼峰自增下划线
有两种解决办法:
- (1)如果这种字段比较少,可以使用 @Column 单独对该字段进行标注:
@Column(name="authorId")
private String authorId;
- (2)如果大量存在这种字段,可以更改默认命名策略,替换为:PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
3.ID自增uuid
@Id
@Column(name = "id")
@GenericGenerator(
name = "uuid2",
strategy = "uuid2",
parameters = {@org.hibernate.annotations.Parameter(
name = "uuid_gen_strategy_class",
value = "org.hibernate.id.uuid.CustomVersionOneStrategy")
})
@GeneratedValue(generator = "uuid2")
private String id;
4.表单关联
User 表:
@ManyToMany(cascade = { CascadeType.MERGE })
@JsonIgnore
@JoinTable(name = "UserRole", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id", referencedColumnName = "id") })
private Collection<Role> roles;
Role表:
@ManyToMany(mappedBy = "roles")
@Basic(fetch = FetchType.EAGER)
private Collection<User> users;