重试保存唯一表,直到在jpa中具有唯一值

时间:2018-10-29 07:14:06

标签: java jpa

我有一个类似的数据库表:

CREATE TABLE tag (
    id uuid PRIMARY KEY,
    created_at timestamp without time zone,
    last_modified_at timestamp without time zone,
    title text NOT NULL,
    slug text UNIQUE
);

此外,我还有一个实体文件,在其中为jpa声明了它:

@Entity
@Table(name = "tag")
public class Tag extends BaseEntity implements Slugged {

    @Id
    @GeneratedValue
    @Column(columnDefinition = "uuid", updatable = false)
    private UUID id;

    @NotBlank
    @Column(columnDefinition = "text")
    private String title;

    @Column(columnDefinition = "text")
    private String slug;

    @Override
    public void slugify() {
        slug = new Slugify().slugify(title);
    }

}

@MappedSuperclass
public abstract class BaseEntity {

    @PrePersist
    @PreUpdate
    public void preSave() {
        if (this instanceof Slugged) {
            if ( StringUtils.isEmpty (((Slugged) this).getSlug()) ) {
                ((Slugged) this).slugify();
            }
        }
    }
}

正如您在BaseEntity中看到的那样,我在PrePersist中设置了子块,该子块必须是唯一的。它基本上可以工作。但是有时可能会发生这样的情况,即两个元组的子段相同。在那种情况下,我希望第一个具有原始的子弹,而下一个则具有子弹,并且旁边有一个递增的数字。

示例:

title     | slug
------------------------
a b       | ab
ab        | ab1

a b被首先创建以来,它就获得了ab,而下一个具有相同子条目的条目应该得到ab1

归档此行为的最佳方法是什么?

0 个答案:

没有答案