该对象不会在 Hibernate 4 中持久化

The object doesn't get persisted in Hibernate 4

我配置了 Hibernate 和 Spring。

配置和Java class:

package com.dao.impl;

import com.dao.IPersonRepository;
import com.dao.impl.generic.GenericRepository;
import com.model.Person;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by ramezanimatin on 8/18/2015.
 */
@Repository
public class PersonRepository extends GenericRepository<Person, Long> implements IPersonRepository {

}


package com.dao;


import com.dao.iGeneric.IGenericRepository;
import com.model.Person;

/**
 * Created by ramezanimatin on 8/18/2015.
 */
public interface IPersonRepository extends IGenericRepository<Person, Long> {
}


package com.dao.iGeneric;

import java.io.Serializable;

/**
 * Created by ramezanimatin on 8/23/2015.
 */
public abstract interface IGenericRepository<T, pk extends Serializable> {
    public void save(T t);

    public T loadByEntityId(pk id);
}




package com.dao.impl.generic;

import com.dao.iGeneric.IGenericRepository;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;

/**
 * Created by ramezanimatin on 8/23/2015.
 */
@Repository
public class GenericRepository<T, pk extends Serializable> implements IGenericRepository<T, pk> {
    @Autowired(required = true)
    private SessionFactory sessionFactory;

    private Session getSession() {
        try {
            return sessionFactory.getCurrentSession();
        } catch (Exception e) {
            return sessionFactory.openSession();
        }
    }

    @Override
    public void save(Object o) {
        getSession().save(o);
    }

    @Override
    public T loadByEntityId(pk id) {
        Session session = getSession();

        Query query = session.createQuery("from Person e where e.id=:id");
        query.setParameter("id", id);
        return ((T) query.uniqueResult());
    }
}

xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
    <context:property-placeholder location="classpath:oracle-hibernate.properties"/>

    <context:component-scan base-package="com"/>

   <!-- <jee:jndi-lookup id="dataSource" jndi-name="test" />-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
    </bean>

    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.model"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql"> ${hibernate.show_sql}</prop>
                <prop key="hibernate.default_schema"> ${hibernate.default_schema}</prop>
                <prop key="hibernate.connection.defaultNChar">true</prop> <!--Oracle need -->
                <prop key="hibernate.connection.characterEncoding">UTF8</prop> <!--Oracle need -->
                <prop key="hibernate.connection.charSet">UTF8</prop> <!--Oracle need -->
                <prop key="hibernate.connection.useEncoding">true</prop> <!--Oracle need -->
                <prop key="hibernate.transaction.factory_class" >${hibernate.transaction.factory_class}</prop>
               <!-- <prop key="hibernate.transaction.manager_lookup_class" >${hibernate.transaction.manager_lookup_class}</prop>
                <prop key="hibernate.current_session_context_class" >${hibernate.current_session_context_class}</prop>-->

            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"
                          proxy-target-class="true"/>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
</beans>

人员服务:

package com.service.impl;

import com.dao.IPersonRepository;
import com.model.Person;
import com.service.IPersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by ramezanimatin on 8/15/2015.
 */
@Service
public class PersonService implements IPersonService {
    @Autowired(required = true)
    private IPersonRepository iPersonRepository;

    @Override
    @Transactional
    public void insertPerson(Person person) {
        iPersonRepository.save(person);
    }

    @Override
    @Transactional
    public void loadByEntityId(Long id) {
        Person person = iPersonRepository.loadByEntityId(id);
        System.out.println(person.getName());
        person.setName("matin");

    }


}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.test</groupId>
    <artifactId>test</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>3.2.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <!-- jpa lib-->
    </dependencies>
    <build>
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

My problem:

在 Hibernate 中,对象模型有 3 种状态:
1- 瞬态
2- 持久
3-分离

我想澄清以下情况:

从数据库中获取对象模型时,它是持久的。在加载 Person 实体时,在 PersonService 的 loadByEntityId 中,它不是持久的。 为什么?
我将名称更改为 'Matin' 但没有提交到数据库。

已更新:

感谢 M。 Deinum 用于解释细微差别。

请删除此方法:

private Session getSession() {
    try {
        return sessionFactory.getCurrentSession();
    } catch (Exception e) {
        return sessionFactory.openSession();
    }
}

并调用 getCurrentSession() 例如:

 Session session = sessionFactory.getCurrentSession();

在这个方法中:

@Override
@Transactional
public void loadByEntityId(Long id) {
    Person person = iPersonRepository.loadByEntityId(id);
    System.out.println(person.getName());
    person.setName("matin");

}

您已找到 Person 个实体,并且已经完成。在幕后,您在 Hibernate 中使用 session 所以这个特定的代码:

    Session session = sessionFactory.getCurrentSession();

    Query query = session.createQuery("from Person e where e.id=:id");
    query.setParameter("id", id);
    return ((T) query.uniqueResult());

仅检索数据。

您需要做的是在您的存储库 IGenericRepository 接口中定义 update 方法:

public abstract interface IGenericRepository<T, pk extends Serializable> {
    public void save(T t);
    public T loadByEntityId(pk id);
    public void updateEntity(T t);
}

GenericRepository中实施:

@Override
public void updateEntity(T entity) {
    getSession().update(entity);
}

IPersonService 方法 updatePerson 中定义并在 PersonService 中实现并使用 Repostitory 中的 updateEntity:

@Override
@Transactional
public void updatePerson(Person person) {
    iPersonRepository.updateEntity(person);
}

现在,当您使用 updatePerson 更新 Person 后使用 loadByEntityId 时,您应该从数据库中检索更新后的实体。