java - hibernate DAO 错误

标签 java mysql hibernate junit

我正在为我的项目创建简单的 DAO。当我使用它时,Hibernate 无法正常工作。提取已删除的实体(实体不存在于数据库中,但 getById 方法返回该实体),不提取持久化实体(实体存在于数据库中,但 Hibernate 无法提取)

简单的 JUnit 测试

LTUser ashBri = dataGen.getUserAshbringer();
        repo.saveOrUpdate(ashBri); << User saved in DB (Checked in MySQLWorkbanch) try merge, save and persist too.
        LTUser result;
        result = repo.getById(ashBri.getId()); << Sometimes found user but sometimes not.
        assertNotNull(result);
        assertEquals(ashBri, result);
        repo.delete(ashBri.getId()); << Remove from DB correctly.
        repo.getById(ashBri.getId()) << NOT NULL, but it not exists in DB

LTUser.class

@Entity
@Table( name = "ltuser", 
    indexes={@Index(columnList = "login", name = "userLogin_index")})
public class LTUser implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id = 0L;
@Column(unique=true)
private String login = new String();
@Temporal(TemporalType.TIMESTAMP)
private Calendar registrationDate = Calendar.getInstance();
private String password = new String();
private String email  = new String();
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "username_id")
private LTUserName name = new LTUserName();
@Enumerated(EnumType.STRING)
private LTUserAgeEnum age = LTUserAgeEnum.ADULT;
private Integer oldGamesCount = 0;
private Integer gamesInPreviousSeason = 0;
private String accessToken = new String();
@Enumerated(EnumType.STRING)
private LTUserRoleEnum role = LTUserRoleEnum.UNREGISTRED;
@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name = "user_attribute", joinColumns = @JoinColumn(name = "user_id"))
@MapKeyColumn(name = "name")
@Column(name = "value")
@MapKeyEnumerated(EnumType.STRING)
private Map<LTUserAttributeEnum, String> attributes = new HashMap<LTUserAttributeEnum, String>();
@ManyToOne
@JoinColumn(name = "rank_id")
private LTRank rank = new LTRank();

LTRank.class

 @Entity
    @Cacheable(value=false)
    @Table(name = "ltusername")
    public class LTUserName implements Serializable {
    public enum NameFormat {
        NAME_LASTNAME, LASTNAME_NAME, NAME_MIDDLENAME_LASTNAME, NAME_LOGIN_LASTNAME, ONLY_NAME
    }

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id = 0L;
    private String lastName = new String();
    private String middleName = new String();
    private String name = new String();

    @Entity
    @Cacheable(value=false)
    @Table(name = "ltrank")
    public class LTRank implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id = 0L;
    private int level = 0;
    private String rankName = new String();
    private short gamesCount = 0;
    private short discount = 0;
    private boolean isDefault = Boolean.FALSE;

LTUserName.class

 @Entity
    @Cacheable(value=false)
    @Table(name = "ltusername")
    public class LTUserName implements Serializable {
    public enum NameFormat {
        NAME_LASTNAME, LASTNAME_NAME, NAME_MIDDLENAME_LASTNAME, NAME_LOGIN_LASTNAME, ONLY_NAME
    }

    public static final String ID_PROPERTY = "id";
    public static final String LAST_NAME_PROPERTY = "lastName";
    public static final String MIDDLE_NAME_PROPERTY = "middleName";
    public static final String NAME_PROPERTY = "name";

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id = 0L;
    private String lastName = new String();
    private String middleName = new String();
    private String name = new String();

**LTRepository.class**

    public abstract class LTRepository<T> implements LTRepositoryIntf<T> {
    final Class<T> clazz;

    public LTRepository(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void closeSession(Session session){
        session.close();
    }

    public Session openSession(){
        Session session = HibernateUtil.openSession();
        return session;
    }

    public void delete(Long id) {
        Session session = HibernateUtil.openSession();
        try{
            session.getTransaction().begin();
            delete(id, session);
            session.getTransaction().commit();
        } finally {
            session.close();
        }
    }

    public void delete(Long id, Session session){
        session.clear();
        Object persistentInstance = session.get(clazz, id);
        if (persistentInstance != null) {
            session.delete(persistentInstance);
        }
    }

    public T getById(Object id){
        Session session = HibernateUtil.openSession();
        try{
            return getById(id, session);
        } finally {
            session.close();
        }
    }

    public T getById(Object id, Session session){
        return (T) session.get(clazz, (Serializable)id);
    }

    @Deprecated
    public T merge(T obj){
        Session session = HibernateUtil.openSession();
        try{
            session.getTransaction().begin();
            obj = merge(obj, session);
            session.getTransaction().commit();
        } finally {
            session.close();
        }
        return obj;
    }
    @Deprecated
    public T merge(T obj, Session session){
        if(session == null){
            return merge(obj);
        }
        obj = (T) session.merge(obj);
        return obj;
    }

    public void saveOrUpdate(T obj){
        Session session = HibernateUtil.openSession();
        try{
            session.getTransaction().begin();
            saveOrUpdate(obj, session);
            session.flush();
            session.getTransaction().commit();
        } finally {
            session.close();
        }
    }

    public void saveOrUpdate(T obj, Session session){
        if(session == null){
            saveOrUpdate(obj);
        }
        session.saveOrUpdate(obj);
    }

    public void update(T obj){
        Session session = HibernateUtil.openSession();
        try{
            session.getTransaction().begin();
            update(obj, session);
            session.getTransaction().commit();
        } finally {
            session.close();
        }
    }

    public void update(T obj, Session session){
        if(session == null){
            update(obj);
        }
        session.update(obj);
    }

    public void save(T obj){
        Session session = HibernateUtil.openSession();
        try{
            session.getTransaction().begin();
            save(obj, session);
            session.getTransaction().commit();
        } finally {
            session.close();
        }
    }

    public void save(T obj, Session session){
        if(session == null){
            save(obj);
        }
        session.update(obj);
    }
    }

HibernateUtils.class

public class HibernateUtil {
public static String PERSISTENCE_UNIT = "/properties/hibernate/hibernate.cfg.xml";
public static String PERSISTENCE_UNIT_OS = "/properties/hibernate/hibernateOpenshift.cfg.xml";
public static String SCHEME_NAME = "dlasertag";

private static SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory(){        
    try {
        if (null != System.getProperty("OPENSHIFT_APP_UUID")) {
            Properties connProperties =  new Properties();
            connProperties.setProperty("connection.url", 
                    String.format("jdbc:mysql://%s:%s/%s", 
                            System.getenv("OPENSHIFT_MYSQL_DB_HOST"), 
                            System.getenv("OPENSHIFT_MYSQL_DB_PORT"),
                            SCHEME_NAME));
            connProperties.setProperty("connection.username", System.getenv("OPENSHIFT_MYSQL_DB_USERNAME"));
            connProperties.setProperty("connection.password", System.getenv("OPENSHIFT_MYSQL_DB_USERNAME"));
            return new Configuration().addProperties(connProperties).configure(PERSISTENCE_UNIT_OS).buildSessionFactory();
        } else {
            return new Configuration().configure(PERSISTENCE_UNIT).buildSessionFactory();
        }
    } catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }

}

public static Session openSession(){
    return sessionFactory.openSession();
}

public static Session getSession(){
    return sessionFactory.getCurrentSession();
}

public SessionFactory getSessionFactory() {
    return sessionFactory;
}

最佳答案

尝试在hibernate.cfg.xml中使用

<property name="hibernate.connection.autocommit">true</property>

你也可以试试

<property name="hibernate.transaction.flush_before_completion">true</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

关于java - hibernate DAO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33390713/

相关文章:

java - Do-while 语句 Java

java - 改进我的搜索方法

hibernate - 从Netbeans JPA添加 hibernate 到现有的Jersey项目

mysql - 选择组中的附加列值

php - 可以从mysql数据库读取数据但无法将数据写入数据库在Ubuntu 16.04上使用PHP 5.6?

java - 无法解析属性 : userId. 用户名

java - Hibernate @Transactionl 错误

java - Notepadv2 教程不工作 - "no notes yet",NoteEdit 类似乎没有被调用

java - JTextArea追加问题

mysql - 如何在表中实现位数据类型