зеркало из
				https://github.com/iharh/notes.git
				synced 2025-10-31 05:36:08 +02:00 
			
		
		
		
	m
Этот коммит содержится в:
		
							родитель
							
								
									cf37a5df05
								
							
						
					
					
						Коммит
						1ed89f158f
					
				
							
								
								
									
										28
									
								
								pl/java/libfws/spring/data/jpa/features/inheritance.txt
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										28
									
								
								pl/java/libfws/spring/data/jpa/features/inheritance.txt
									
									
									
									
									
										Обычный файл
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | 2023 | ||||||
|  | https://www.baeldung.com/hibernate-inheritance | ||||||
|  |     https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate-mapping | ||||||
|  | 
 | ||||||
|  |     @MappedSuperclass (no @Entity) | ||||||
|  |         This (base) class no longer has an @Entity annotation, as it won't be persisted in the database by itself. | ||||||
|  |         Childrens will just duplicate columns for inherited fields | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     for @Inheritance(strategy = InheritanceType.SINGLE_TABLE) | ||||||
|  |         @DiscriminatorColumn (at base class), @DiscriminatorValue | ||||||
|  |         DiscriminatorFormula | ||||||
|  | 
 | ||||||
|  |     for @Inheritance(strategy = InheritanceType.JOINED) | ||||||
|  |         The disadvantage of this inheritance mapping method is that retrieving entities requires joins between tables, | ||||||
|  | 
 | ||||||
|  |     for @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) | ||||||
|  |         The resulting schema is similar to the one using @MappedSuperclass. | ||||||
|  |         But Table per Class will indeed define entities for parent classes, | ||||||
|  |         allowing associations and !!!"polymorphic"!!! queries as a result. | ||||||
|  | 
 | ||||||
|  |         This is not that different from merely mapping each entity without inheritance. | ||||||
|  | 
 | ||||||
|  |         The distinction is clear when querying the base class, which will return all the subclass records | ||||||
|  |         as well by using a UNION statement in the background. | ||||||
|  | 
 | ||||||
|  |         The use of UNION can also lead to inferior performance when choosing this strategy. | ||||||
|  |         Another issue is that we can no longer use identity key generation. | ||||||
							
								
								
									
										19
									
								
								pl/java/libfws/spring/data/jpa/features/repositories.txt
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										19
									
								
								pl/java/libfws/spring/data/jpa/features/repositories.txt
									
									
									
									
									
										Обычный файл
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | 2023 | ||||||
|  | https://www.baeldung.com/spring-data-composable-repositories | ||||||
|  |     https://github.com/eugenp/tutorials/blob/master/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java | ||||||
|  |         @EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class) | ||||||
|  | 
 | ||||||
|  |     https://github.com/eugenp/tutorials/blob/master/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/daos/impl/ExtendedRepositoryImpl.java | ||||||
|  |         public class ExtendedRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements ExtendedRepository<T, ID> { | ||||||
|  | 
 | ||||||
|  |     https://github.com/eugenp/tutorials/blob/master/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/daos/ExtendedRepository.java | ||||||
|  |           @NoRepositoryBean | ||||||
|  |           public interface ExtendedRepository<T, ID extends Serializable> extends JpaRepository<T, ID> { | ||||||
|  |               List<T> findByAttributeContainsText(String attributeName, String text); | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |     https://github.com/eugenp/tutorials/blob/master/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/daos/impl/CustomItemRepositoryImpl.java | ||||||
|  |         @Repository | ||||||
|  |         public class CustomItemRepositoryImpl implements CustomItemRepository | ||||||
|  | 2022 | ||||||
|  | https://vladmihalcea.com/custom-spring-data-repository/ | ||||||
| @ -1,5 +1,34 @@ | |||||||
| https://docs.oracle.com/javaee/7/api/javax/persistence/LockModeType.html | https://docs.oracle.com/javaee/7/api/javax/persistence/LockModeType.html | ||||||
|  |     READ,  OPTIMISTIC, (obtains an optimistic read lock for all entities containing a version attribute) | ||||||
|  |                         persistence provider will prevent our data from dirty reads as well as non-repeatable reads. | ||||||
|  |     WRITE, OPTIMISTIC_FORCE_INCREMENT, (the same as OPTIMISTIC and additionally increments the version attribute value) | ||||||
|  |     PESSIMISTIC_READ  (select for share), | ||||||
|  |     PESSIMISTIC_WRITE (select for update), | ||||||
|  |     PESSIMISTIC_FORCE_INCREMENT (if our entity is not directly modified within transaction, but we want Hibernate do it at flush-time), | ||||||
|  |     NONE; | ||||||
|  | https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html | ||||||
|  |     readOnly | ||||||
|  |     rollBackFor/noRollbackFor, timeout | ||||||
|  |     https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html | ||||||
|  |         MANDATORY | ||||||
|  |         NESTED | ||||||
|  |         NEVER | ||||||
|  |         NOT_SUPPORTED | ||||||
|  |         REQUIRED (it is impossible to override [timeout,isolation,readOnly] attrs, which just inherits) | ||||||
|  |         REQUIRES_NEW | ||||||
|  |         SUPPORTS | ||||||
|  |     https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Isolation.html | ||||||
|  |         DEFAULT | ||||||
|  |         READ_COMMITTED | ||||||
|  |         READ_UNCOMMITTED | ||||||
|  |         REPEATABLE_READ | ||||||
|  |         SERIALIZABLE | ||||||
|  | 
 | ||||||
|  | PG | ||||||
|  |     select ... for [no key] update|share [skip locked] ... of [table-alias] | ||||||
|  | 
 | ||||||
| https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Lock.html | https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Lock.html | ||||||
|  |     apply locking to all records, returned by a given query in JPA repo | ||||||
| 
 | 
 | ||||||
| 2023 | 2023 | ||||||
| https://www.linkedin.com/pulse/implementing-optimistic-pessimistic-locking-spring-boot-sanchez | https://www.linkedin.com/pulse/implementing-optimistic-pessimistic-locking-spring-boot-sanchez | ||||||
| @ -7,17 +36,78 @@ https://www.linkedin.com/pulse/implementing-optimistic-pessimistic-locking-sprin | |||||||
|     https://github.com/csdavidg/db-locking-poc |     https://github.com/csdavidg/db-locking-poc | ||||||
| 2022 | 2022 | ||||||
| https://vladmihalcea.com/spring-transaction-best-practices/ | https://vladmihalcea.com/spring-transaction-best-practices/ | ||||||
|  |     https://vladmihalcea.com/read-write-read-only-transaction-routing-spring/ | ||||||
| https://vladmihalcea.com/spring-data-jpa-locking/ | https://vladmihalcea.com/spring-data-jpa-locking/ | ||||||
|  |     lockById method, and his custom impl | ||||||
|  |     https://vladmihalcea.com/hibernate-locking-patterns-how-do-pessimistic_read-and-pessimistic_write-work/ | ||||||
|  |         really huge | ||||||
| https://vladmihalcea.com/read-write-read-only-transaction-routing-spring/ | https://vladmihalcea.com/read-write-read-only-transaction-routing-spring/ | ||||||
| https://vladmihalcea.com/a-beginners-guide-to-transaction-isolation-levels-in-enterprise-java/ | https://vladmihalcea.com/a-beginners-guide-to-transaction-isolation-levels-in-enterprise-java/ | ||||||
| 
 | 
 | ||||||
|  | https://www.baeldung.com/transaction-configuration-with-jpa-and-spring | ||||||
|  |     https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa-2  | ||||||
|  |     org.springframework.transaction logging -> TRACE | ||||||
| https://www.baeldung.com/jpa-optimistic-locking | https://www.baeldung.com/jpa-optimistic-locking | ||||||
|  |     OptimisticLockException | ||||||
| https://www.baeldung.com/jpa-pessimistic-locking | https://www.baeldung.com/jpa-pessimistic-locking | ||||||
|  |     https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate-jpa | ||||||
|  |     @Lock annotation at JPA repo-method | ||||||
|  |     entityManager.find(...) | ||||||
|  |     entityManager.createQuery("...").setLockMode(...) | ||||||
|  |     entityManager.lock(resultEntity, LockModeType.PESSIMISTIC_WRITE); | ||||||
|  |     entityManager.refresh(resultEntity, LockModeType.PESSIMISTIC_FORCE_INCREMENT); | ||||||
|  |     @NamedQuery(..., lockMode = PESSIMISTIC_READ) | ||||||
|  |     Scope | ||||||
|  |         The PessimisticLockScope.NORMAL is the default scope. | ||||||
|  |         With this locking scope, we lock the entity itself. | ||||||
|  |         When used with @Inheritance(strategy=InheritanceType.JOINED) inheritance, it also locks the ancestors. | ||||||
|  | 
 | ||||||
|  |         The EXTENDED scope covers the same functionality as NORMAL. | ||||||
|  |         In addition, it's able to block related entities in a join table. | ||||||
|  |         Simply put, it works with entities annotated with @ElementCollection or @OneToOne, @OneToMany, etc. with @JoinTable. | ||||||
|  | 
 | ||||||
| https://www.baeldung.com/java-jpa-transaction-locks | https://www.baeldung.com/java-jpa-transaction-locks | ||||||
|     https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate-jpa  |     https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate-jpa  | ||||||
| 
 | 
 | ||||||
|  | https://softice.dev/posts/introduction_to_declarative_tx_management/ | ||||||
|  |     AbstractEntity, Logging Transactions via debug for JpaTransactionManager | ||||||
|  |     (logging.level.org.springframework.orm.jpa=debug) at application.properties | ||||||
|  |     PlatformTransactionManager, TransactionTemplate | ||||||
|  |         In some helper | ||||||
|  |         @Transactional(propagation = Propagation.REQUIRES_NEW) | ||||||
|  |         public <T, R> R executeWithNewTrans(Function<T, R> f, T val) { | ||||||
|  |             return f.apply(val); | ||||||
|  |         } | ||||||
|  |     Note: It is surprising that the transaction is committed in case of checked exceptions. | ||||||
|  |           The rationale is that checked exceptions are considered business exceptions | ||||||
|  |           and we should check the business rules to see if we do need a rollback or not. | ||||||
|  |     Note: Good overview of propagations !!! | ||||||
|  |     Note: for JpaTransactionManager in case of readOnly="true", the calls of persist will just be silently ignored (no exceptions) !!! | ||||||
|  |           for DataSourceTransactionManager - ex is thrown | ||||||
|  |               @Transactional(transactionManager="tmCreationMethodName") | ||||||
|  | 
 | ||||||
| https://softice.dev/posts/optimistic_and_pessimistic_locking_with_spring_data_jpa/ | https://softice.dev/posts/optimistic_and_pessimistic_locking_with_spring_data_jpa/ | ||||||
|  |     https://github.com/anrosca/optimistic_and_pessimistic_concurrency_control | ||||||
|  |     notes: using spring RetryTemplate, @Retriable(ObjectOptimisticLockingFailureException) !!! | ||||||
|  | 
 | ||||||
| https://hackernoon.com/optimistic-and-pessimistic-locking-in-jpa | https://hackernoon.com/optimistic-and-pessimistic-locking-in-jpa | ||||||
|  |     notes: 1. Keep in mind that the version number does not change when changing the @OneToMany and @ManyToMany | ||||||
|  |            collections with the mappedBy attribute.  | ||||||
|  |            2. If it is impossible to add a new column to the table, but there is a need to use optimistic locking, | ||||||
|  |               you can apply Hibernate annotations OptimisticLocking and DynamicUpdate. | ||||||
|  |               The type value in the OptimisticLocking annotation can take the following values: | ||||||
|  |                   ALL     - perform locking based on all fields | ||||||
|  |                   DIRTY   - perform locking based on only changed fields fields | ||||||
|  |                   VERSION - perform locking using a dedicated version column | ||||||
|  |                   NONE    - don’t perform locking | ||||||
|  |            3. Conclusion | ||||||
|  |               Optimistic locks are suitable for situations where an exception that has been thrown can be easily handled | ||||||
|  |               and either notify the user or try again. | ||||||
|  |               At the same time, rows at the database level are not blocked, which does not slow down the operation of the application. | ||||||
|  | 
 | ||||||
|  |               However, using pessimistic locking, you need to carefully write and check the code because | ||||||
|  |               there is a possibility of deadlocks | ||||||
| 
 | 
 | ||||||
| 2021 | 2021 | ||||||
| https://habr.com/ru/company/otus/blog/574470/ | https://habr.com/ru/company/otus/blog/574470/ | ||||||
|  |     spring transactional errors | ||||||
|  | |||||||
		Загрузка…
	
	
			
			x
			
			
		
	
		Ссылка в новой задаче
	
	Block a user
	 Ihar Hancharenka
						Ihar Hancharenka