Reputation: 69
I have a Product Entity with filds like name, price, and so on
I have a Category Entity with name, List of Products and a Promotion Interface which in runtime can be any subclass -> So a Category is saved in DB like: Category(name = "Biotics", List = products, promotion = EasterPromotionSeason)
I have a Store which have a Set of Categories
The problem is, my program works fine untill the point that i need to call a REST Endpoint to add Categories in Store
If my Category have a Promotion of type EasterPromotionSeason, saved in DB, when i save that Category in Store set, that Promotion becomes ChristmasPromotionSeason and i don't want that
I get it is because of Dirty Checking, but i didn't updated my Promotion or anything like that, but Hibernate does:
Hibernate: insert into PROJECT_HIBERNATE_Store (STORE_LOCATION_CITY, STORE_LOCATION_COUNTRY, STORE_LOCATION_ZIPCODE, storeName, storeType, STORE_ID) values (?, ?, ?, ?, ?, ?)
Hibernate: select store0_.STORE_ID as store_id1_7_, store0_.PROMOTION_STORE_ID as promotio7_7_, store0_.STORE_LOCATION_CITY as store_lo2_7_, store0_.STORE_LOCATION_COUNTRY as store_lo3_7_, store0_.STORE_LOCATION_ZIPCODE as store_lo4_7_, store0_.storeName as storenam5_7_, store0_.storeType as storetyp6_7_ from PROJECT_HIBERNATE_Store store0_ where store0_.storeType=?
Hibernate: select category0_.CATEGORY_ID as category1_0_, category0_.CATEGORY_DESCRIPTION as category2_0_, category0_.CATEGORY_NAME as category3_0_, category0_.PROMOTION_ID as promotio4_0_ from PROJECT_HIBERNATE_Category category0_ where category0_.CATEGORY_NAME=?
Hibernate: select promotion0_.promotionId as promotio1_6_0_, promotion0_.NUMBER_PRODUCTS_AT_PROMOTION as number_p2_6_0_, promotion0_.PROMOTION_SEASON as promotio3_6_0_, promotion0_.PROMOTION_STORE_ID as promotio4_6_0_ from PROJECT_HIBERNATE_Promotion promotion0_ where promotion0_.promotionId=?
Hibernate: select productcol0_.PRODUCT_CATEGORY_ID as product11_5_0_, productcol0_.PRODUCT_ID as product_1_5_0_, productcol0_.PRODUCT_ID as product_1_5_1_, productcol0_.PRODUCT_DESCRIPTION as product_2_5_1_, productcol0_.PRODUCT_NAME as product_3_5_1_, productcol0_.PRODUCT_EXPIRES_AT_ as product_4_5_1_, productcol0_.PRODUCT_PRICE as product_5_5_1_, productcol0_.PRODUCED_AT_ as produced6_5_1_, productcol0_.PRODUCT_QUANTITY as product_7_5_1_, productcol0_.PRODUCT_STATUS as product_8_5_1_ from PROJECT_HIBERNATE_Product productcol0_ where productcol0_.PRODUCT_CATEGORY_ID=?
Hibernate: select pricecolle0_.PRODUCT_ID as product_3_4_0_, pricecolle0_.PRICE_ID as price_id1_4_0_, pricecolle0_.PRICE_ID as price_id1_4_1_, pricecolle0_.PRICE_AMOUNT as price_am2_4_1_, pricecolle0_.PRODUCT_ID as product_3_4_1_, pricecolle0_1_.CURRENCY_EUROPE as currency1_2_1_, pricecolle0_1_.SHIPPING_COSTS_IN_EU as shipping2_2_1_, pricecolle0_2_.US_CURRENCY as us_curre1_8_1_, pricecolle0_2_.SHIPPING_COSTS_IN_US as shipping2_8_1_, case when pricecolle0_1_.EUROPE_PRICE_ID is not null then 1 when pricecolle0_2_.US_PRICE_ID is not null then 2 when pricecolle0_.PRICE_ID is not null then 0 end as clazz_1_ from PROJECT_HIBERNATE_Price pricecolle0_ left outer join PROJECT_HIBERNATE_EuropePrice pricecolle0_1_ on pricecolle0_.PRICE_ID=pricecolle0_1_.EUROPE_PRICE_ID left outer join PROJECT_HIBERNATE_USPrice pricecolle0_2_ on pricecolle0_.PRICE_ID=pricecolle0_2_.US_PRICE_ID where pricecolle0_.PRODUCT_ID=?
Hibernate: select productlis0_.PROMOTION_PRODUCT_ID as promotio9_5_0_, productlis0_.PRODUCT_ID as product_1_5_0_, productlis0_.PRODUCT_ID as product_1_5_1_, productlis0_.PRODUCT_DESCRIPTION as product_2_5_1_, productlis0_.PRODUCT_NAME as product_3_5_1_, productlis0_.PRODUCT_EXPIRES_AT_ as product_4_5_1_, productlis0_.PRODUCT_PRICE as product_5_5_1_, productlis0_.PRODUCED_AT_ as produced6_5_1_, productlis0_.PRODUCT_QUANTITY as product_7_5_1_, productlis0_.PRODUCT_STATUS as product_8_5_1_ from PROJECT_HIBERNATE_Product productlis0_ where productlis0_.PROMOTION_PRODUCT_ID=?
Hibernate: select categoryse0_.CATEGORY_STORE_ID as category5_0_0_, categoryse0_.CATEGORY_ID as category1_0_0_, categoryse0_.CATEGORY_ID as category1_0_1_, categoryse0_.CATEGORY_DESCRIPTION as category2_0_1_, categoryse0_.CATEGORY_NAME as category3_0_1_, categoryse0_.PROMOTION_ID as promotio4_0_1_, promotion1_.promotionId as promotio1_6_2_, promotion1_.NUMBER_PRODUCTS_AT_PROMOTION as number_p2_6_2_, promotion1_.PROMOTION_SEASON as promotio3_6_2_, promotion1_.PROMOTION_STORE_ID as promotio4_6_2_ from PROJECT_HIBERNATE_Category categoryse0_ left outer join PROJECT_HIBERNATE_Promotion promotion1_ on categoryse0_.PROMOTION_ID=promotion1_.promotionId where categoryse0_.CATEGORY_STORE_ID=?
Hibernate: select category0_.CATEGORY_ID as category1_0_0_, category0_.CATEGORY_DESCRIPTION as category2_0_0_, category0_.CATEGORY_NAME as category3_0_0_, category0_.PROMOTION_ID as promotio4_0_0_, promotion1_.promotionId as promotio1_6_1_, promotion1_.NUMBER_PRODUCTS_AT_PROMOTION as number_p2_6_1_, promotion1_.PROMOTION_SEASON as promotio3_6_1_, promotion1_.PROMOTION_STORE_ID as promotio4_6_1_ from PROJECT_HIBERNATE_Category category0_ left outer join PROJECT_HIBERNATE_Promotion promotion1_ on category0_.PROMOTION_ID=promotion1_.promotionId where category0_.CATEGORY_ID=?
Hibernate: update PROJECT_HIBERNATE_Promotion set PROMOTION_SEASON=? where promotionId=?
Hibernate: update PROJECT_HIBERNATE_Category set CATEGORY_STORE_ID=? where CATEGORY_ID=?
Hibernate: select customerco0_.CUSTOMER_STORE_ID as customer8_1_0_, customerco0_.CUSTOMER_ID as customer1_1_0_, customerco0_.CUSTOMER_ID as customer1_1_1_, customerco0_.CUSTOMER_MONEY as customer2_1_1_, customerco0_.CUSTOMER_CITY as customer3_1_1_, customerco0_.CUSTOMER_COUNTRY as customer4_1_1_, customerco0_.CUSTOMER_EMAIL as customer5_1_1_, customerco0_.CUSTOMER_NAME as customer6_1_1_, customerco0_.CUSTOMER_PRENAME as customer7_1_1_ from PROJECT_HIBERNATE_Customer customerco0_ where customerco0_.CUSTOMER_STORE_ID=?
Hibernate: select productcol0_.PRODUCT_CATEGORY_ID as product11_5_0_, productcol0_.PRODUCT_ID as product_1_5_0_, productcol0_.PRODUCT_ID as product_1_5_1_, productcol0_.PRODUCT_DESCRIPTION as product_2_5_1_, productcol0_.PRODUCT_NAME as product_3_5_1_, productcol0_.PRODUCT_EXPIRES_AT_ as product_4_5_1_, productcol0_.PRODUCT_PRICE as product_5_5_1_, productcol0_.PRODUCED_AT_ as produced6_5_1_, productcol0_.PRODUCT_QUANTITY as product_7_5_1_, productcol0_.PRODUCT_STATUS as product_8_5_1_ from PROJECT_HIBERNATE_Product productcol0_ where productcol0_.PRODUCT_CATEGORY_ID=?
Hibernate: select pricecolle0_.PRODUCT_ID as product_3_4_0_, pricecolle0_.PRICE_ID as price_id1_4_0_, pricecolle0_.PRICE_ID as price_id1_4_1_, pricecolle0_.PRICE_AMOUNT as price_am2_4_1_, pricecolle0_.PRODUCT_ID as product_3_4_1_, pricecolle0_1_.CURRENCY_EUROPE as currency1_2_1_, pricecolle0_1_.SHIPPING_COSTS_IN_EU as shipping2_2_1_, pricecolle0_2_.US_CURRENCY as us_curre1_8_1_, pricecolle0_2_.SHIPPING_COSTS_IN_US as shipping2_8_1_, case when pricecolle0_1_.EUROPE_PRICE_ID is not null then 1 when pricecolle0_2_.US_PRICE_ID is not null then 2 when pricecolle0_.PRICE_ID is not null then 0 end as clazz_1_ from PROJECT_HIBERNATE_Price pricecolle0_ left outer join PROJECT_HIBERNATE_EuropePrice pricecolle0_1_ on pricecolle0_.PRICE_ID=pricecolle0_1_.EUROPE_PRICE_ID left outer join PROJECT_HIBERNATE_USPrice pricecolle0_2_ on pricecolle0_.PRICE_ID=pricecolle0_2_.US_PRICE_ID where pricecolle0_.PRODUCT_ID=?
Hibernate: select productlis0_.PROMOTION_PRODUCT_ID as promotio9_5_0_, productlis0_.PRODUCT_ID as product_1_5_0_, productlis0_.PRODUCT_ID as product_1_5_1_, productlis0_.PRODUCT_DESCRIPTION as product_2_5_1_, productlis0_.PRODUCT_NAME as product_3_5_1_, productlis0_.PRODUCT_EXPIRES_AT_ as product_4_5_1_, productlis0_.PRODUCT_PRICE as product_5_5_1_, productlis0_.PRODUCED_AT_ as produced6_5_1_, productlis0_.PRODUCT_QUANTITY as product_7_5_1_, productlis0_.PRODUCT_STATUS as product_8_5_1_ from PROJECT_HIBERNATE_Product productlis0_ where productlis0_.PROMOTION_PRODUCT_ID=?
Hibernate: select productlis0_.STORE_ID as store_id1_3_0_, productlis0_.PRODUCT_ID as product_2_3_0_, productlis0_.PRODUCT_POSITION as product_3_0_, product1_.PRODUCT_ID as product_1_5_1_, product1_.PRODUCT_DESCRIPTION as product_2_5_1_, product1_.PRODUCT_NAME as product_3_5_1_, product1_.PRODUCT_EXPIRES_AT_ as product_4_5_1_, product1_.PRODUCT_PRICE as product_5_5_1_, product1_.PRODUCED_AT_ as produced6_5_1_, product1_.PRODUCT_QUANTITY as product_7_5_1_, product1_.PRODUCT_STATUS as product_8_5_1_ from PROJECT_HIBERNATE_MANY_STORES_TO_MANY_PRODUCTS_IDS productlis0_ inner join PROJECT_HIBERNATE_Product product1_ on productlis0_.PRODUCT_ID=product1_.PRODUCT_ID where productlis0_.STORE_ID=?
What can i do to avoid this:
Hibernate: update PROJECT_HIBERNATE_Promotion set PROMOTION_SEASON=? where promotionId=?
Hibernate: update PROJECT_HIBERNATE_Category set CATEGORY_STORE_ID=? where CATEGORY_ID=?
Edited: My app properties file:
spring.datasource.url=jdbc:h2:mem:shopping-project
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=so
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.enabled=true
Upvotes: 0
Views: 97
Reputation: 52488
You can set spring.jpa.hibernate.ddl-auto
explicitly and the standard Hibernate property values are none
, validate
, update
, create-drop
. Therefore, change
spring.jpa.hibernate.ddl-auto=create-drop
to
spring.jpa.hibernate.ddl-auto=update
or another value if you want (maybe validate
).
Reference document https://docs.spring.io/spring-boot/docs/1.1.0.M1/reference/html/howto-database-initialization.html#howto-initialize-a-database-using-hibernate
Update based on source code
focus at
@Bean
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean()
{
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setDataSource(dataSource());
Properties properties = new Properties();
properties.put("hibernate.hbm2ddl.auto", "create");
localContainerEntityManagerFactoryBean.setJpaProperties(properties);
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter());
localContainerEntityManagerFactoryBean.setPackagesToScan("com.balabasciuc.shoppingprojectwithhibernate");
return localContainerEntityManagerFactoryBean;
}
this line
properties.put("hibernate.hbm2ddl.auto", "create");
Cause auto create schema.
Upvotes: 1