зеркало из
https://github.com/iharh/notes.git
synced 2025-10-30 13:16:07 +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
|
||||
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
|
||||
apply locking to all records, returned by a given query in JPA repo
|
||||
|
||||
2023
|
||||
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
|
||||
2022
|
||||
https://vladmihalcea.com/spring-transaction-best-practices/
|
||||
https://vladmihalcea.com/read-write-read-only-transaction-routing-spring/
|
||||
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/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
|
||||
OptimisticLockException
|
||||
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://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://github.com/anrosca/optimistic_and_pessimistic_concurrency_control
|
||||
notes: using spring RetryTemplate, @Retriable(ObjectOptimisticLockingFailureException) !!!
|
||||
|
||||
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
|
||||
https://habr.com/ru/company/otus/blog/574470/
|
||||
spring transactional errors
|
||||
|
||||
Загрузка…
x
Ссылка в новой задаче
Block a user