簡體   English   中英

如何插入自定義ID使用Spring數據jdbc的記錄?

[英]How to insert a record with custom id use Spring data jdbc?

對於Spring 數據JPA,我可以使用@GeneratedValue(strategy = GenerationType.AUTO)插入一條帶有自定義id 的記錄,但是對於Spring 數據JDBC,我如何插入一條帶有自定義id 的記錄? 我試圖用 id 插入,但沒有拋出異常,記錄也沒有插入到表中。

使用 Spring Data JDBC 做到這一點的方法是注冊一個BeforeSaveEvent ApplicationListener來創建 id 並將其設置在實體中。

@Bean
public ApplicationListener<BeforeSaveEvent> idSetting() {

    return event -> {

        if (event.getEntity() instanceof LegoSet) {

            LegoSet legoSet = (LegoSet) event.getEntity();
            if (legoSet.getId() == null) {
                legoSet.setId(createNewId());
            }
        }
    };
}

Spring Data Examples 中有一個例子證明了這一點

您的行未插入表中但您也沒有收到異常的原因是:Spring Data JDBC 得出結論,自設置 ID 並執行更新以來實體已經存在。 但由於它不存在,更新未能更新任何行,所以什么也沒發生。 創建改進請求以檢查更新計數是否為 0 可能是值得的。

更新

由於版本 1.1 JdbcAggregateTemplate.insert可用,允許您在不檢查聚合是否為新的情況下進行插入。 如果需要,您可以使用它在存儲庫中創建自定義方法,或者您可以在任何需要的地方自動裝配模板並直接使用它。

同樣使用 DATAJDBC-438 Spring Data JDBC 會在保存聚合時拋出異常,導致更新但更新更新零行,因此此類問題不會被忽視。

我找到了另一種方法來解決這個問題,雖然有點麻煩。

// BaseEntity
public class BaseEntity implements Persistable, Serializable {

    @Id
    String id;

    @Transient
    @JsonIgnore
    private boolean newEntity;

    @Override
    public Object getId() {
        return id;
    }

    public void setNew(boolean newInstance) {
        this.newEntity = newInstance;
    }

    @Override
    @JsonIgnore
    public boolean isNew() {
        return newEntity;
    }
}

// User
User extends BaseEntity
...


// insert
User user = new User();
user.id = "5bffb39cc5e30ba067e86dff";
user.setName("xiangzi");
user.setNew(true);
userRepository.save(user);


// update
User user = new User();
user.id = "5bffb39cc5e30ba067e86dff";
user.setName("xiangzi2");
userRepository.save(user);

插入時需要添加一行user.setNew(true); .

謝謝!

我還在這里添加了評論。

我在上面提到了翔希的回答,並略有不同:

@Data
@Table
public class TestDataTable implements Persistable<String> {


@Id
String id;

private String name;

@Transient
@JsonIgnore
private boolean newEntity;

@Override
public String getId() {
    return id;
}

public void setNew(boolean newInstance) {
    this.newEntity = newInstance;
}

@Override
@JsonIgnore
public boolean isNew() {
    return newEntity;
}
}

// created new record when we use task.setNew(true) in TestDataTable with String Id.
public Mono<TestDataTable> saveTestData(TestDataTable task) {
    task.setNew(true);

    return testRepository.save(task);
}

我也為限制而苦苦掙扎。 有一些解決方法https://spring.io/blog/2021/09/09/spring-data-jdbc-how-to-use-custom-id-generation ,但它們對我來說不是完美的解決方案。

我正在為 SQLite 開發 Spring 數據 JDBC 集成,它提供了一個存儲庫助手 class,它公開了 JdbcAggregateTemplate 的insert()update() API( https://github.com/komamitsu/spring-data-sqlhelper ). 該機制不是特定於 SQLite 的,因此我認為盡管需要一些實現,但同樣的方法也可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM