Spring Notyes
Spring Notyes
Spring Notyes
@Transactional
When we want to configure the transactional behavior of a method, we can do it
with:
@Transactional
void pay() {}
@NoRepositoryBean
Sometimes we want to create repository interfaces with the only goal of providing
common methods for the child repositories.
@NoRepositoryBean
interface MyUtilityRepository<T, ID extends Serializable> extends CrudRepository<T,
ID> {
Optional<T> findById(ID id);
}
Copy
This annotation doesn't affect the child interfaces; hence Spring will create a
bean for the following repository interface:
@Repository
Copy
Note, that the example above isn't necessary since Spring Data version 2 which
includes this method replacing the older T findOne(ID id).
freestar
2.3. @Param
We can pass named parameters to our queries using @Param:
2.4. @Id
@Id marks a field in a model class as the primary key:
class Person {
@Id
Long id;
// ...
}
Copy
Since it's implementation-independent, it makes a model class easy to use with
multiple data store engines.
freestar
2.5. @Transient
We can use this annotation to mark a field in a model class as transient. Hence the
data store engine won't read or write this field's value:
class Person {
// ...
@Transient
int age;
// ...
}
Copy
Like @Id, @Transient is also implementation-independent, which makes it convenient
to use with multiple data store implementations.
// ...
@CreatedBy
User creator;
@LastModifiedBy
User modifier;
@CreatedDate
Date createdAt;
@LastModifiedDate
Date modifiedAt;
// ...
}
Copy
Note, that if we want Spring to populate the principals, we need to use Spring
Security as well.
For a more thorough description, please visit this article.
3.2. @Procedure
With Spring Data JPA we can easily call stored procedures from repositories.
First, we need to declare the repository on the entity class using standard JPA
annotations:
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "count_by_name",
procedureName = "person.count_by_name",
parameters = {
@StoredProcedureParameter(
mode = ParameterMode.IN,
name = "name",
type = String.class),
@StoredProcedureParameter(
mode = ParameterMode.OUT,
name = "count",
type = Long.class)
}
)
})
class Person {}
Copy
After this, we can refer to it in the repository with the name we declared in the
name argument:
@Procedure(name = "count_by_name")
long getCountByName(@Param("name") String name);
Copy
3.3. @Lock
We can configure the lock mode when we execute a repository query method:
@Lock(LockModeType.NONE)
@Query("SELECT COUNT(*) FROM Person p")
long getPersonCount();
Copy
The available lock modes:
READ
WRITE
OPTIMISTIC
OPTIMISTIC_FORCE_INCREMENT
PESSIMISTIC_READ
PESSIMISTIC_WRITE
PESSIMISTIC_FORCE_INCREMENT
NONE
3.4. @Modifying
We can modify data with a repository method if we annotate it with @Modifying:
@Modifying
@Query("UPDATE Person p SET p.name = :name WHERE p.id = :id")
void changeName(@Param("id") long id, @Param("name") String name);
3.5. @EnableJpaRepositories
@Configuration
@EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao")
4.1. @Document
This annotation marks a class as being a domain object that we want to persist to
the database:
@Document(collection = "user")
@Field("email")
String emailAddress;
// ...
@Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository")
class MongoConfig
{