spring boot direct sql by entitymanager

ใครที่ใช้ Spring boot เชื่อมต่อ database ด้วย JPA เราจะคุ้นเคยกับคำสั่งของมันเช่น save() , findById(), findByField() แต่เมื่อไรที่ลักษณะงานของเรานั้น ต้องรับค่า input มาเป็น raw sql เราจะทำอย่างไร

ใช้งานใน Spring (@Controller,@RestController,@Service,@Repository)

import javax.persistence.EntityManager;
import org.hibernate.SQLQuery;
import org.hibernate.Session;

@PersistenceContext
private EntityManager entityManager;

.....

Session session = entityManager.unwrap(org.hibernate.Session.class);

String sql = "update TABLE set FIELD = y where FIELD_WHERE = 'xxx'";

SQLQuery query = session.createSQLQuery(sql);
int result = query.executeUpdate();

return String.valueOf(result);

ใช้งานนอก Spring ยืมการใช้งานผ่าน service

@Service
public class SomeServiceImpl implements SomeService {

    @PersistenceContext(unitName = "your_persistence_unit_name")
    private EntityManager entityManager;

    @Override
    @Transactional("transactionManager")
    public Session getSession() {
        return entityManager.unwrap(org.hibernate.Session.class);
    }
}

public class Foo{

    public void someMethod(){
        SomeService someService =
        ApplicationContextProvider.getApplicationContext().getBean(SomeService.class);
        Session session = someService.getSession().getSessionFactory().openSession();
        ....
    }
}

@PersistenceContext
A persistence context handles a set of entities which hold data to be persisted in some persistence store (e.g. a database). In particular, the context is aware of the different states an entity can have (e.g. managed, detached) in relation to both the context and the underlying persistence store

Session session = utilService.getSession().getSessionFactory().openSession();
Posted in spring boot | Leave a comment

spring boot @SpringBootApplication,@EnableAutoConfiguration ใช้ทำอะไร

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(LoginApplication.class, args);
    }
}

The Spring Boot documentation อธิบาย @SpringBootApplication ไว้ว่า

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes: [...]

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.

“เนื่องจากโปรแกรมเมอร์จำนวนมาก ใช้ annotated 3 อันนี้ร่วมกันบ่อยครั้ง @Configuration,@EnableAutoConfiguration และ @ComponentScan จึงยุบรวมอยู่ใน @SpringBootApplication ไปเลย”

ทีนี้เรามาดูกันว่า Annonation 3 ตัวนี้ทำหน้าที่อะไร

  1. @Configuration tags the class as a source of bean definitions for the application context. (Class ที่มี source ของ Bean ด้วย method ที่มี @Bean)
  2. @EnableAutoConfiguration It tells Spring to setup some basic infrastructure judging by what you have in the classpath. It’s done by invoking a so called import class that’s derived from the value of the @Import annotation that @EnableAutoConfiguration includes. Only one class should be annotated with @EnableAutoConfiguration (โหลดใช้งาน Required Bean ที่จำเป็นให้เราอัตโนมัติ เช่นถ้าใช้ JPA มันก็จะมองหา @Entity ให้อัตโนมัติ)
  3. @ComponentScan tells Spring to look for other components, configurations, and services in the the root package, allowing it to find the controllers. (บอกให้ Spring รู้จัก Annotated ภายใต้ Package ที่ระบุ ถ้าไม่ระบุก็จะเป็น ภายใต้ Package ของ Class ที่ใส่ @ComponentScan)

ถ้าหากต้องการ Custom เราสามารถใส่ Annotated เพิ่มเติมได้ เช่น หากเราไม่ต้องการโหลด Config บางตัวอัตโนมัติ

@SpringBootApplication
@EnableAutoConfiguration(exclude = LiquibaseAutoConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(LoginApplication.class, args);
    }

}

แหล่งอ้างอิง

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

https://stackoverflow.com/questions/33619532/configuration-using-annotation-springbootapplication

https://stackoverflow.com/questions/39247487/why-spring-boot-application-class-needs-to-have-configuration-annotation

Posted in spring boot | Leave a comment

spring boot transactional force commit

บางครั้งถ้ามี Query หลายๆ Statement ต่อกัน อาจทำให้เกิดข้อผิดพลาด Constraint เช่นพวก Unique ได้ เพราะมันจะรอ commit พร้อมกัน เราจึงต้องย้ายบาง Statement ไปสร้างเป็น method ใหม่ และใส่ Annonation นี้ไว้บนหัว method เพื่อที่จะ force commit

@Transactional(value = "transactionManager",propagation = Propagation.REQUIRES_NEW)

https://stackoverflow.com/questions/24338150/how-to-manually-force-a-commit-in-a-transactional-method

Posted in jquery, spring boot | Leave a comment

oracle jdbc connection style

Thin-style

jdbc:oracle:thin:@HOST:PORT/SERVICE_NAME

TNSname-style

jdbc:oracle:thin:@(description=(address=(host=HOST)(protocol=tcp)
(port=PORT))(CONNECT_DATA=(SERVICE_NAME=SERVICE_NAME)))

TNSNames Alias Syntax

You can find the available TNSNAMES entries listed in the tnsnames.ora file on the client computer from which you are connecting. On Windows, this file is located in the ORACLE_HOME\NETWORK\ADMIN directory. On UNIX systems, you can find it in the ORACLE_HOME directory or the directory indicated in your TNS_ADMIN environment variable.

For example, if you want to connect to the database on host myhost as user scott with password tiger that has a TNSNAMES entry of MyHostString, then write the following:

OracleDataSource ods = new OracleDataSource();
ods.setTNSEntryName("MyTNSAlias");
ods.setUser("scott");
ods.setPassword("tiger");
ods.setDriverType("oci");
Connection conn = ods.getConnection();

The oracle.net.tns_admin system property must be set to the location of the tnsnames.ora file so that the JDBC Thin driver can locate the tnsnames.ora file. For example:

System.setProperty("oracle.net.tns_admin", "c:\\Temp");
String url = "jdbc:oracle:thin:@tns_entry";

Note:

When using TNSNames with the JDBC Thin driver, you must set the oracle.net.tns_admin property to the directory that contains your tnsnames.ora file.

java -Doracle.net.tns_admin=$ORACLE_HOME/network/admin

Spring boot datasource

public DataSource dataSourceWrite() {
DataSource dataSource = new DataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(OracleUrl);
dataSource.setUsername(OracleUsername);
dataSource.setPassword(OraclePassword);
dataSource.setMaxActive(maxActive);
dataSource.setMaxIdle(maxIdle);
dataSource.setMinIdle(minIdle);
dataSource.setInitialSize(initialSize);
dataSource.setMaxWait(maxWait);
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery("SELECT * FROM DUAL");
return dataSource;
}

reference http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm

Posted in java | Leave a comment

how to verify facebook access token?

1.Get App AccessToken

https://graph.facebook.com/oauth/access_token?client_id=xxx&client_secret=yyy&grant_type=client_credentials

2.Get Token Info

https://graph.facebook.com/debug_token?input_token=Facebook Token&access_token=App Access Token

Posted in ไม่มีหมวดหมู่ | Leave a comment