hibernate Spring Data JPA как сохранить объект с идентификатором - PullRequest
0 голосов
/ 04 ноября 2018
public class ProductInfo {

    @Id
    private String productId;

    /** 名字. */
    private String productName;

    /** 单价. */
    private BigDecimal productPrice;
    ...

    @Test
    public void saveTest() {
        ProductInfo productInfo = new ProductInfo();
        productInfo.setProductId("123456");
        productInfo.setProductName("皮蛋粥");
        productInfo.setProductPrice(new BigDecimal(3.2));
        productInfo.setProductStock(100);
        productInfo.setProductDescription("很好喝的粥");
        productInfo.setProductIcon("http://xxxxx.jpg");
        productInfo.setProductStatus(0);
        productInfo.setCategoryType(3);

//        ProductInfo result = repository.save(productInfo);
        ProductInfo result = repository.saveAndFlush(productInfo);
        Assert.assertNotNull(result);
    }

Я хочу сохранить объект с идентификатором, который не записан в базе данных.

Hibernate: 
    select
        productinf0_.product_id as product_1_3_0_,
        productinf0_.category_type as category2_3_0_,
        productinf0_.create_time as create_t3_3_0_,
        productinf0_.product_description as product_4_3_0_,
        productinf0_.product_icon as product_5_3_0_,
        productinf0_.product_name as product_6_3_0_,
        productinf0_.product_price as product_7_3_0_,
        productinf0_.product_status as product_8_3_0_,
        productinf0_.product_stock as product_9_3_0_,
        productinf0_.update_time as update_10_3_0_ 
    from
        product_info productinf0_ 
    where
        productinf0_.product_id=?
Hibernate: 
    update
        product_info 
    set
        create_time=?,
        product_price=?,
        update_time=? 
    where
        product_id=?

Согласно правилам hibernate, невозможно сохранить данные в базе данных, выбрав объект с идентификатором первым в обновлении. Как мне это сделать? Спасибо за ваш ответ.

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Хотя ответ от Алена Круза может сработать нормально, я бы не сделал этого так, как вы запланировали.

Я бы просто добавил стандартное поле идентификатора и установил productId уникальный, например:

@Id
@GeneratedValue
private Long id;

@Column(unique=true)
private String productId;

Затем в репозиторий ProductInfo просто добавьте что-то вроде:

Optional<ProductInfo> findByProductId(String productId);
0 голосов
/ 04 ноября 2018

Hibernate требуется id, поэтому добавьте тип генерации к id и сделайте productId уникальным, как показано ниже, и пусть Hibernate обрабатывает все.

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column(unique=true)
private String productId;
0 голосов
/ 04 ноября 2018

После прочтения документации Hibernate в операции сохранения сохраняются только сущности с автоматически сгенерированными идентификаторами. Итак, если вы намереваетесь установить идентификатор самостоятельно, то вам нужно изменить метод вставки для persist.

@Test
public void saveTest() {
    ProductInfo productInfo = new ProductInfo();
    productInfo.setProductId("123456");
    productInfo.setProductName("皮蛋粥");
    productInfo.setProductPrice(new BigDecimal(3.2));
    productInfo.setProductStock(100);
    productInfo.setProductDescription("很好喝的粥");
    productInfo.setProductIcon("http://xxxxx.jpg");
    productInfo.setProductStatus(0);
    productInfo.setCategoryType(3);

    // Insert new product.
    repository.persist(productInfo);
}

Для получения дополнительной информации, вы можете проверить этот блог .

...