Я пытаюсь выяснить, какие преимущества дает аннотация @Repository. Я понимаю, что @Component, @ Service, @ Repository - это в основном аннотации стереотипов, которые в основном используются для разделения слоев и применения точек AOP. Единственное, что я узнал, что @repository обеспечивает автоматический перевод исключений. У меня вопрос как?
Я реализовал следующий класс dao, используя шаблон JDBC и базу данных H2:
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void saveUser(Users user) {
try {
jdbcTemplate.update("insert into users(name,address,age) values (?,?,?)",
new Object[] { user.getName(), user.getAddress(), null });
} catch (DataAccessException e) {
e.printStackTrace();
}
}
}
Класс сущности:
@Entity
public class Users {
@Column(name = "name", nullable = true)
private String name;
@Column(name = "address", nullable = true)
private String address;
@Column(name = "age", nullable = false)
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Существует необязательное ограничение на столбец age в БД. Я ожидал исключение как обернутый объект DataAccessException в случае, если я использую @Repository и обычное исключение H2 DB, если я использую @component или @service. Но этого не происходит. Он показывает одну и ту же кривую исключения независимо от того, какую аннотацию я использую.
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [insert into users(name,address,age) values (?,?,?)]; integrity constraint violation: NOT NULL check constraint; SYS_CT_10092 table: USERS column: AGE; nested exception is java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10092 table: USERS column: AGE
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:87)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1414)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:862)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:917)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:927)
at com.spring.practice.dao.daoimpl.UserDaoImpl.saveUser(UserDaoImpl.java:18)
at com.spring.practice.service.serviceimpl.UserServiceImpl.saveUser(UserServiceImpl.java:38)
at com.spring.practice.main.MainClass.main(MainClass.java:14)
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10092 table: USERS column: AGE
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at org.springframework.jdbc.core.JdbcTemplate.lambda$update$0(JdbcTemplate.java:867)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
... 6 more
Caused by: org.hsqldb.HsqlException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10092 table: USERS column: AGE
Так что мое единственное замешательство - какие преимущества дает @repository?
Заранее спасибо.