Java Springboot 中 mySQL 的自定义生成的具有持久序列的列值

Custom generated column value with persistent sequence for mySQL in Java Springboot

假设 mySQL 数据库中的 table 看起来像这样,包含以下列:

| id  | name | reference|

我目前正在使用 spring-bootspring-jpa.

当我坚持这个实体时,有没有办法让引用列仅在它为空时以自定义方式自动生成。例如:

INSERT INTO my_table(name,reference) VALUES('John', 'MREF-System-0940');

会产生如下结果

| id  | name | reference        |
| 1   | John | MREF-System-0940 |

但是当我执行以下命令时

INSERT INTO my_table(name) VALUES('John');

将产生如下结果(引用基于 'REF-{name}-{sequence}' 其中序列可以是 id 或预定义的持久序列)

| id  | name | reference  |
| 2   | John | REF-John-2 |

它应该在持久化实体时检测到该列为空时自动生成引用列reference

如果可能,我们可以在末尾附加生成的 id 列吗?如果没有,是否有一种可行的方法来自动生成这样的引用。

意思是如果我们这样做

INSERT INTO my_table(name) VALUES('Bob');

可能会产生如下结果

| id  | name | reference   |
| 3   | Bob  | REF-Bob-001 |

要使 JPA 生成字段值,您应该使用 myEntityRepository#save 而不是本机修改查询。

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    String name;
    String reference;

    public MyEntity(String name) {
        this.name = name;
    }

    //getters, setters, toString, hashcode, equals

    @PostPersist
    public void setReferencePostPersist(){
        if(id != null) {
            reference = "REF-" + name + "-" + id;
        }
    }
}

然后

@Autowired
MyEntityRepository repository;

public MyEntity saveNewMyEntity(String name) {
    MyEntity myEntity = new MyEntity(name);   
    return repository.save(myEntity);
}