【问题标题】:Hibernate JPA + OSGi + SQLite, how?Hibernate JPA + OSGi + SQLite,怎么样?
【发布时间】:2014-04-14 01:33:52
【问题描述】:

我在将 Hibernate JPA 与 OSGi (Apache Aries) 和 SQLite 数据库集成时遇到问题。问题是 Hibernate 无法将实体类持久化到表中。没有错误表明在持久化实体类时发生了任何问题,但我看不到 SQL 插入语句是由用于 Derby 数据库的 Hibernate 生成的。

所以当我这样打电话时:

People aPeople = new PeopleImpl();
aPeople.setAddress("555 abc st, richmond");
aPeople.setName("AAA Smith");
aPeople.setNumber(555555);

PeoplePersistenceService peoplePersistenceService = 
    peoplePersistenceServiceTracker.getService();

peoplePersistenceService.AddPeople(aPeople);

aPeople 不会被插入到表中。

我为 Derby 工作的当前配置,所以我认为主要部分应该是正确的,但我可能会遗漏一些 SQLite 特定的东西。我做了很多搜索,但找不到 Hibernate JPA AND OSGi AND SQLite 的示例。

我通过包装 xerial sqlite jdbc v3.7.15-M1 创建了 SQLite 包。我还从 Internet (http://code.google.com/p/hibernate-sqlite/source/browse/trunk/source/src/main/java/com/applerao/hibernatesqlite/dialect/SQLiteDialect.java) 复制了 SQLite 方言代码来构建休眠方言。

如果有人可以向我展示适用于这种情况的正确配置或为我指出正确的方向,我真的很合适。

以下是我的设置,如果您需要任何其他信息,请告诉我。

datasource.xml:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            default-activation="lazy">

    <bean id="sqliteDataSource" class="org.sqlite.SQLiteDataSource">
        <property name="url" value="jdbc:sqlite:aeServerDatabase.db"/>
    </bean>

    <service ref="sqliteDataSource" interface="javax.sql.DataSource">
        <service-properties>
            <entry key="osgi.jndi.service.name" value="jdbc/sqlite/AeServerDatabase" />
        </service-properties>
    </service>
</blueprint>

persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_2_0.xsd"
                version="2.0">

   <persistence-unit name="peopleExampleSQLite" transaction-type="RESOURCE_LOCAL">
       <description>Persistence Unit for the People Persistence Example with SQLite</description>
       <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <non-jta-data-source>osgi:service/jdbc/sqlite/AeServerDatabase</non-jta-data-source>
       <class>ae.bundles.services.dal.example.PeopleImpl</class>
       <exclude-unlisted-classes>true</exclude-unlisted-classes>

       <properties>
<!--            <property name="javax.persistence.jdbc.driver" value="org.sqlite.JDBC"/> -->
<!--            <property name="javax.persistence.jdbc.url" value="jdbc:sqlite:aeServerDatabase.db"/> -->
<!--            <property name="hibernate.connection.driver_class" value="org.sqlite.JDBC"/> -->
<!--            <property name="hibernate.connection.url" value="jdbc:sqlite:aeServerDatabase.db"/> -->

<!--             The special SQL dialect for SQLite  -->
           <property name="hibernate.dialect" value="ae.bundles.services.dal.dialect.SQLiteDialect"/>
           <property name="hibernate.hbm2ddl.auto" value="create"/>

           <property name="hibernate.show_sql" value="true"/>
           <property name="hibernate.format_sql" value="true"/>
       </properties>
   </persistence-unit>

</persistence>

blueprint.xml:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0"
    xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.1.0"
    default-activation="lazy">

    <bean id="peoplePersistenceImpl"
        class="ae.bundles.services.dal.example.PeoplePersistenceServiceImpl">
        <tx:transaction method="*" value="Required"/>
        <jpa:context property="entityManager" unitname="peopleExampleSQLite" />
    </bean>

    <service ref="peoplePersistenceImpl"
        interface="ae.bundles.services.dal.example.PeoplePersistenceService" />

</blueprint>

实体类:

package ae.bundles.services.dal.example;

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

@Entity
public class PeopleImpl implements People
{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private Integer number;
    private String address;

    public void setName(String name) 
    {
        this.name = name;
    }

    public String getName() 
    {
        return name;
    }

    public void setNumber(Integer num) 
    {
        this.number = num;
    }

    public Integer getNumber() 
    {
        return number;
    }

    public void setAddress(String address) 
    {
        this.address = address;
    }

    public String getAddress() 
    {
        return address;
    }

    public Long getId()
    {
        return id;
    }

}

持久化类:

package ae.bundles.services.dal.example;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;

public class PeoplePersistenceServiceImpl implements PeoplePersistenceService 
{
    private EntityManager em;

    public PeoplePersistenceServiceImpl() {}

    public void setEntityManager(EntityManager em)
    {
        this.em = em;
    }

    public void AddPeople(People p) 
    {
        em.persist(p);
    }

    public People getPeopleByName(String name) 
    {
        String query = "SELECT e FROM PeopleImpl e" +
                " WHERE e.name = '" + name + "'";

        People p = null;

        try
        {
            p = em.createQuery(query, People.class).getSingleResult();
        }
        catch (NoResultException e)
        {
            return null;
        }
        catch (NonUniqueResultException e)
        {
            System.out.println("More than one result available!");
            return null;
        }

        return p;
    }

    public void updatePeopleName(People p, String newName)
    {
        //People target = em.find(PeopleImpl.class, p.getId());
        People target = getPeopleByName(p.getName());

        if (target != null)
        {
            target.setName(newName);
            em.flush();
        }
    }

    public void removePeople(People p) 
    {
        //People target = em.find(PeopleImpl.class, p.getId());
        People target = getPeopleByName(p.getName());

        if (target != null)
        {
            em.remove(target);
            em.flush();
        }
    }

}

【问题讨论】:

    标签: hibernate sqlite jpa osgi


    【解决方案1】:

    您的获取/更新/删除方法有效吗?如果是这样,你的配置就可以了,你只需要在你的插入方法中添加一个刷新。我没有以这种方式使用过hibernate,所以我不能说你的配置是否正确。无论哪种方式,如果您希望将此数据从一级缓存持久保存到数据库中,则应该在插入后刷新。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我在使用 AEM cms 时遇到了同样的问题,它也适用于 OSGI。

      我的回答贴在这里: AEM CQ with JPA (Hibernate)

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2013-12-23
        • 2012-12-27
        • 2021-11-27
        • 2015-06-13
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 2011-07-17
        相关资源
        最近更新 更多