javax.persistence.PersistenceException: Unable to locate persistence units

19,913

Solution 1

This looks like a problem with the XML schema for JPA 2.1 version.

Try and look at this solution. Hope it works for you.

Solution 2

If you use Eclipse, please check into export window 'copy required libraries into a subfolder next to the generated JAR'.

Solution 3

You should pass persistence unit name to Persistence.createEntityManagerFactory which is present in yours persistence.xml:

<persistence-unit name="my-pu" transaction-type="RESOURCE_LOCAL"> 

Try calling:

Persistence.createEntityManagerFactory("my-pu");

Name given as argument in createEntityManagerFactory should exist in one of persistence elements in your xml file.

Share:
19,913
Java Developer
Author by

Java Developer

The past does not matter, as long as I follow two key principles: 1- Define each problem clearly. 2- Act Test Driven, test each small step, go further if it was successful.

Updated on June 04, 2022

Comments

  • Java Developer
    Java Developer almost 2 years

    I had a Maven project, I converted it to JPA project that now works with Maven. My persistence.xml is as follows:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
        <persistence-unit name="my-pu" transaction-type="RESOURCE_LOCAL">
            <description>My Persistence Unit</description>
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <class>model.entity.Tweet</class>
            <class>model.entity.TweetHashtag</class>
            <class>model.entity.TweetUrl</class>
            <class>model.entity.User</class>
            <exclude-unlisted-classes>true</exclude-unlisted-classes>
            <properties>
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
                <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/tweetDB"/>
                <property name="hibernate.connection.username" value="root"/>
                <property name="hibernate.connection.password" value="root"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tweetDB"/>
                <property name="javax.persistence.jdbc.user" value="root"/>
                <property name="javax.persistence.jdbc.password" value=""/>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            </properties>
        </persistence-unit>
    </persistence>
    

    …and I have the following entities:

    package model.entity; 
    
    @Entity
    @Table(name="tweets")
    
    public class Tweet implements Serializable{
    
        private static final long serialVersionUID = -1041037108182045708L;
        @Id
        @Column(name="tweet_id")
        private int tweetId;
    
        @Column(name="tweet_text")
        private String tweetText;
    
        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "created_at", nullable = false, length = 19)
        private Date createdAt;
    
        @Column(name="lang_code")
        private String languageCode;
    
        @ManyToOne(optional=false)
        @JoinColumn(name = "user_id",referencedColumnName="user_id")
        private User user;
    
        @OneToMany(mappedBy="tweet")
        private Set<TweetHashtag> hashtags=new HashSet<TweetHashtag>(0);
    
        @OneToMany(mappedBy="tweet")
        private Set<TweetUrl> links=new HashSet<TweetUrl>(0);
    
        public int getTweetId() {
            return tweetId;
        }
    
        public void setTweetId(int tweetId) {
            this.tweetId = tweetId;
        }
    
        public String getTweetText() {
            return tweetText;
        }
    
        public void setTweetText(String tweetText) {
            this.tweetText = tweetText;
        }
    
        public Date getCreatedAt() {
            return createdAt;
        }
    
        public void setCreatedAt(Date createdAt) {
            this.createdAt = createdAt;
        }
    
        public String getLanguageCode() {
            return languageCode;
        }
    
        public void setLanguageCode(String languageCode) {
            this.languageCode = languageCode;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        public Set<TweetHashtag> getHashtags() {
            return hashtags;
        }
    
        public void setHashtags(Set<TweetHashtag> hashtags) {
            this.hashtags = hashtags;
        }
    
        public Set<TweetUrl> getLinks() {
            return links;
        }
    
        public void setLinks(Set<TweetUrl> links) {
            this.links = links;
        }
    
    }
    //////////////////////////////////   
    package model.entity;
    
    @Entity
    @Table(name="tweet_hashtag")
    public class TweetHashtag implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 6302465277669302540L;
    
        @Id @GeneratedValue
        @Column(name="hashtag_id")
        private int hastagId;
    
        public int getHastagId() {
            return hastagId;
        }
    
        public void setHastagId(int hastagId) {
            this.hastagId = hastagId;
        }
    
        @ManyToOne
        @JoinColumn(name = "tweet_id",referencedColumnName="tweet_id")
        private Tweet tweet;
    
        @Column(name="hashtag")
        private String hashtag;
    
        public Tweet getTweet() {
            return tweet;
        }
    
        public void setTweet(Tweet tweet) {
            this.tweet = tweet;
        }
    
        public String getHashtag() {
            return hashtag;
        }
    
        public void setHashtag(String hashtag) {
            this.hashtag = hashtag;
        }
    
    }
    
    package model.entity;
    ///////////////////////////////////////
    
    @Entity
    @Table(name="tweet_urls")
    public class TweetUrl implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -606690240421717136L;
    
        @Id @GeneratedValue
        @Column(name="url_id")
        private int urlId;
    
        public int getUrlId() {
            return urlId;
        }
    
        public void setUrlId(int urlId) {
            this.urlId = urlId;
        }
    
        @ManyToOne
        @JoinColumn(name="tweet_id",referencedColumnName="tweet_id")
        private Tweet tweet;
    
        @Column(name="url")
        private String url;
    
        public Tweet getTweet() {
            return tweet;
        }
    
        public void setTweet(Tweet tweet) {
            this.tweet = tweet;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
    }
    ////////////////////////////
    package model.entity;
    
    @Entity
    @Table(name="users")
    
    public class User implements Serializable{
    
        @Id
        @Column(name="user_id")
        private int userId;
    
        @Column(name="screen_name")
        private String screenName;
    
        @Column(name="profile_image_url")
        private String profileImageUrl;
    
        @Column(name="statuses_count")
        private int statusesCount;
    
        @OneToMany(mappedBy="user")
        private List<Tweet> tweets;
    
        public int getUserId() {
            return userId;
        }
    
        public void setUserId(int userId) {
            this.userId = userId;
        }
    
        public String getScreenName() {
            return screenName;
        }
    
        public void setScreenName(String screenName) {
            this.screenName = screenName;
        }
    
        public String getProfileImageUrl() {
            return profileImageUrl;
        }
    
        public void setProfileImageUrl(String profileImageUrl) {
            this.profileImageUrl = profileImageUrl;
        }
    
        public int getStatusesCount() {
            return statusesCount;
        }
    
        public void setStatusesCount(int statusesCount) {
            this.statusesCount = statusesCount;
        }
    
        public List<Tweet> getTweets() {
            return tweets;
        }
    
        public void setTweets(List<Tweet> tweets) {
            this.tweets = tweets;
        }
    
    }
    
    //////////////////
    

    Here, the error occurs:

    package model;
    
    public class TweetPersistent {
    
        private EntityManagerFactory emf;
    
        private EntityManager em;
    
        public void persist(Pair<String, QueryResult> pair) {
            List<Status> tweets = pair.getValue().getTweets();
    
            for (Status tweet : tweets) {
                this.insertToDB(pair.getKey(), tweet);
                // or  this.batchInsertToDB(pair.getKey(), tweet);
            }
    
        }
    
        private void insertToDB(String key, Status tweet) {
            emf = Persistence.createEntityManagerFactory("TwitterQueryApp");
            em = emf.createEntityManager();
            em.getTransaction().begin();
            em.persist(new Pair<String, Status>(key, tweet));
            em.getTransaction().commit();
    
            // Insert code here 
    
        }
    
        private void batchInsertToDB(String key, Status tweet) {
            // insert batch 
    
        }
    
    }
    
    ///////////
    

    Now the error: "javax.persistence.PersistenceException: Unable to locate persistence units"

    Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
    log4j:WARN No appenders could be found for logger (twitter4j.HttpClientImpl).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Exception in thread "Thread-1" javax.persistence.PersistenceException: Unable to locate persistence units
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:101)
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:88)
        at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:69)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
        at model.TweetPersistent.insertToDB(TweetPersistent.java:32)
        at model.TweetPersistent.persist(TweetPersistent.java:24)
        at controller.TwitterStreamConsumer.run(TwitterStreamConsumer.java:25)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: javax.persistence.PersistenceException: Invalid persistence.xml.
    Error parsing XML [line : -1, column : -1] : cvc-elt.1: Deklaration des Elements "persistence" kann nicht gefunden werden.
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.validate(PersistenceXmlParser.java:377)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.loadUrl(PersistenceXmlParser.java:310)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.parsePersistenceXml(PersistenceXmlParser.java:114)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.doResolve(PersistenceXmlParser.java:104)
        at org.hibernate.jpa.boot.internal.PersistenceXmlParser.locatePersistenceUnits(PersistenceXmlParser.java:86)
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:97)
        ... 8 more
    

    I included different jars: hibernate-validation, java-persistence, hibernate-jpa and hibernate-entityManager in the build path and also class path of project itself. I also copied persistence.xml in resource folder. I did lots of things, but it does not work, getting always the same error.

    Thank you in advance for your suggestions!

  • Java Developer
    Java Developer almost 9 years
    now it says :Caused by: javax.persistence.PersistenceException: Invalid persistence.xml. Error parsing XML [line : -1, column : -1] : cvc-elt.1: Deklaration des Elements "persistence" kann nicht gefunden werden.
  • Java Developer
    Java Developer almost 9 years
    Exception in thread "Thread-1" javax.persistence.PersistenceException: Unable to locate persistence units
  • Java Developer
    Java Developer almost 9 years
    Tnx now it is better: Exception in thread "Thread-1" java.lang.IllegalArgumentException: Unknown entity: javafx.util.Pair at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(Abst‌​ractEntityManagerImp‌​l.java:1184) at model.TweetPersistent.insertToDB(TweetPersistent.java:35) at model.TweetPersistent.persist(TweetPersistent.java:24) at controller.TwitterStreamConsumer.run(TwitterStreamConsumer.j‌​ava:25) at java.lang.Thread.run(Thread.java:745)
  • Paweł Głowacz
    Paweł Głowacz almost 9 years
    I have no idea what Pair is. EntityManager works only if you define @Entity annotation for your class that need to be persisted and you need to define this class in persistence.xml. Otherwise you will see above exception.