1

I am trying to learn how to use spring with JPA to connect to a database. I do not want to use persistence.xml and want to create an entity manager using the least amount of code possible.

So, I tried this solution from this page (https://vladmihalcea.com/how-to-bootstrap-jpa-programmatically-without-the-persistence-xml-configuration-file/) and it worked. However, it looks more complicated than I want it to be, and it does not incorporate any spring elements or any annotations to lessen the amount of code.

my code incorporates a solution from this question (Create JPA EntityManager without persistence.xml configuration file)

I took the configuration code from Tobogganski, he wrote it for Postgresql, and I am trying to make it work for Mysql.

The Config.java file

package jj;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

@Configuration
@EnableAutoConfiguration
@EntityScan(basePackages= "entity")
public class Config {


    private final String DB_URL = "jdbc:mysql://localhost:3306/dictionary";
    private final String DB_USER_NAME = "root";
    private final String DB_PASSWORD = "";

    @Bean
    public Properties hibernateProperties(){
        final Properties properties = new Properties();

        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.id.new_generator_mappings", false);
        properties.put("hibernate.connection.datasource", getMysqlDataSource());

        return properties;
    }

    @Bean
    protected DataSource getMysqlDataSource() {
    MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL(DB_URL);
        mysqlDataSource.setUser(DB_USER_NAME);
        mysqlDataSource.setPassword(DB_PASSWORD);
    return mysqlDataSource;
    }

    @Bean(name = "emf")
    public EntityManagerFactory entityManagerFactory( DataSource dataSource, Properties hibernateProperties ){
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource( dataSource );
        em.setJpaVendorAdapter( new HibernateJpaVendorAdapter() );
        em.setJpaProperties( hibernateProperties );
        em.setPersistenceUnitName( "dictionary" );
        em.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        em.afterPropertiesSet();

        return em.getObject();
    }

}


The DictElement class

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PersistenceUnit;

import org.springframework.stereotype.Component;

@Component
@Entity
@PersistenceUnit(unitName="dictionary")
public class DictElement {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    @Column
    private String word;
    @Column
    private String genre;
    @Column
    private String definition;


    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getWord() {
        return word;
    }
    public void setWord(String word) {
        this.word = word;
    }
    public String getGenre() {
        return genre;
    }
    public void setGenre(String genre) {
        this.genre = genre;
    }
    public String getDefinition() {
        return definition;
    }
    public void setDefinition(String definition) {
        this.definition = definition;
    }

}

The driver class

package ui;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import entity.DictElement;
import jj.Config;


public class driver {

    public static void main(String[] args) {

        ApplicationContext ctx =new AnnotationConfigApplicationContext(Config.class);

         EntityManagerFactory emf= (EntityManagerFactory) ctx.getBean("emf", EntityManagerFactory.class);

         EntityManager em = null;

        try {

          em=  emf.createEntityManager();

          DictElement element= new DictElement();

          element.setWord("word");
          element.setGenre("type");
          element.setDefinition("definition");

          em.getTransaction().begin();
          em.persist(element);
          em.getTransaction().commit();
        } catch (Exception ex)
            {
                ex.printStackTrace();
                if (em != null)
                {
                    em.getTransaction().rollback();
                }
            }


    }

}



Finally, the database name is dictionary, it contains one table called "dict_table", the table is made of three columns the first is "word", the second is "genre", the the third is "definition".

When I run this code, it gives me an error 'No persistence unit with name 'dictionary' found ', but I am sure that there is more problems with my code.

the thing is, how Can I substitute this line from persistence.xml which we are not using here

( persistence-unit name="dictionary" transaction-type="RESOURCE_LOCAL" )

with only java code and annotations.

and as you can see from the driver class. I am trying to insert one element to the local database table.

1 Answers1

1

In your driver class,see this: import java.io.ObjectInputFilter.Config;.

DIscord
  • 61
  • 5
  • Thank you, this solved the problem with no bean named 'emf', but now the code has the problem of no persistence unit named 'dictionary'. the code still does not work. – Ismael Alsabea Aug 28 '19 at 18:44