Spring ORM

Spring ORM

Dependency

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${springframework.version}</version>
</dependency>

database.properties

jdbc.url=jdbc:mariadb://localhost:3306/kingdom
jdbc.driver=org.mariadb.jdbc.Driver
jdbc.username=root
jdbc.password=1234

hibernate.dialect=org.hibernate.dialect.MariaDBDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.creation_policy=update

Bean for DataSource

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="url" value="${jdbc.url}"/>
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

With SessionFactory bean

Bean for SessionFactory

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.rakovets.course.java.spring.orm.dal.entity"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.creation_policy}</prop>
        </props>
    </property>
</bean>

Using

public class UserDao {
    @Autowired
    private SessionFactory sessionFactory;

    protected SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Override
    public void save(User entity) {
        sessionFactory.getCurrentSession().save(entity);
    }
}

With EntityManagerFactory bean

Bean for EntityManagerFactory

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="by.rakovets.course.java.spring.orm.dal.entity"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.creation_policy}</prop>
        </props>
    </property>
</bean>

Using: way 1

@Repository
public class Dao {
    @Autowired
    private EntityManagerFactory factory;

    public EntityManager getEm() {
        if (em.get() == null) {
            em.set(factory.createEntityManager());
        }
        return em.get();
    }

    // ...
}

Using: way 2

@Repository
public class Dao {
    @PersistenceContext(name = "entityManagerFactory")
    private EntityManager em;

    public void saveTest() {
        Employee e = new Employee();
        e.setFirstName("Dmitry");
        e.setLastName("Rakovets");

        em.persist(e);
        em.clear();
    }
}