自从用了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;