Spring Data Jpa
Parsaبرای استفاده از Spring data jpa ابتدا باید Bean های مورد نیاز رو کانفیگ کنیم .
دوتا Bean لازم داریم; یکی entityManagerFactory و دیگری transactionManager .
برای تامین entityManagerFactory از کلاس LocalContainerEntityManagerFactoryBean استفاده میکنیم, این bean نیاز به سه تا پارامتر داره :
1-باید property های jpa رو بهش بدیم مثلا show_sql و format_sql
2- باید dataSource رو بهش بدیم که اینجا این رو هم بعنوان یک bean تعریف میکنیم
3-باید jpaVendor رو مشخص کنیم . یعنی provider jpa که در مثال ما hibernate هست
@Configuration
@EnableJpaRepositories("com.example.dao")
@EnableTransactionManagement
public class JpaConfig {
@Bean
public DataSource dataSource(){
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
try {
dataSource.setDriver(new Driver());
dataSource.setUrl("jdbc:mysql://localhost:3306/spring_data_sample");
dataSource.setPassword("");
dataSource.setUsername("root");
} catch (SQLException e) {
e.printStackTrace();
}
return dataSource;
}
private Properties jpaProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto","update");
properties.setProperty("hibernate.show_sql","true");
properties.setProperty("hibernate.format_sql","true");
properties.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL8Dialect");
return properties;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Autowired DataSource dataSource) {
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setDataSource(dataSource);
localContainerEntityManagerFactoryBean.setPackagesToScan("com.example.model");
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties());
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return localContainerEntityManagerFactoryBean;
}
@Bean
public PlatformTransactionManager transactionManager(){
JpaTransactionManager platformTransactionManager = new JpaTransactionManager();
return platformTransactionManager;
}
حالا همه چیز آماده ست . کافیه یک اینترفیس بسازیم و بعد از Repository ارث بری داشته باشیم:
public interface MemberDao3 extends Repository<Member,Long> {
}
بعد میتونیم query method های خودمون رو اضافه کنیم به هر نحوی که میخوایم . Spring data خودش میاد query ها رو برای ما ایجاد میکنه و حتی به return type ای که برای query method میذاریم احترام میذاره و معمولا اونو برمیگردونه :
public interface MemberDao3 extends Repository<Member,Long> {
//query method
void save(Member mem);
}
میتونیم چنین return type ای داشته باشیم :
public interface MemberDao3 extends Repository<Member,Long> {
// query method with return type
Member save(Member mem);
}
البته میتونیم از اینترفیس هایی که دارن Repository رو پیاده سازی میکنن استفاده کنیم. مثلا CrudRepository متد save و .. مورد نیاز ما رو دارن.
public interface MemberDao3 extends CrudRepository<Member,Long> {
}
حتی میتونیم CustomRepository تعریف کنیم که توی گیت براتون گذاشتم و لینک گیت رو اخرش قرار میدم
کلاس Member:
package com.example.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.*;
@Table
@Entity
@Setter
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
public class Member {
@Id
@GeneratedValue
private long id;
@NonNull
private String name;
}
اینم از main :
import com.example.conf.Config;
import com.example.model.Member;
import com.example.dao.MemberDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx=new AnnotationConfigApplicationContext(Config.class);
MemberDao mem= ctx.getBean(MemberDao.class);
mem.save(new Member("Amir"));
}
}