Hibernate Spring Data JPA如何使用ID保存对象

时间:2018-11-04 16:35:05

标签: java mysql hibernate spring-data-jpa

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);
    }

我要保存一个ID为ID的对象,该对象未记录在数据库中。

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=?

根据休眠规则,无法通过在更新时首先选择ID为ID的对象来将数据保存到数据库中。我该怎么做?谢谢您的回答。

3 个答案:

答案 0 :(得分:0)

通过阅读Hibernate文档,保存操作仅保留具有自动生成ID的实体。因此,如果您打算自己设置ID,那么您需要的是更改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);
}

有关更多信息,您可以查看此blog

答案 1 :(得分:0)

虽然the answer from Alain Cruz可以正常工作,但我不会按照您的计划进行。

我只需添加一个标准ID字段并设置productId唯一,例如:

@Id
@GeneratedValue
private Long id;

@Column(unique=true)
private String productId;

然后在ProductInfo存储库中只需添加以下内容:

Optional<ProductInfo> findByProductId(String productId);

答案 2 :(得分:0)

休眠需要一个productId,因此将生成类型添加到id并使@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(unique=true) private String productId; 像下面一样唯一,然后让休眠处理所有事情。

+-----+--------+-------+--------+---------+----------------------+
| ID  |  Name  |  Lat  |  Long  |  Speed  |       DateTime       |
+-----+--------+-------+--------+---------+----------------------+
|  1  |  Test  |   121 |  2131  |      0  |  10-11-2018T12:00:00 |
|  1  |  Test  |   121 |  2131  |    100  |  10-11-2018T12:10:00 |
|  1  |  Test  |   121 |  2131  |      0  |  10-11-2018T01:00:00 |
|  1  |  Test  |   121 |  2131  |    102  |  10-11-2018T01:10:00 |
+-----+--------+-------+--------+---------+----------------------+