gpt4 book ai didi

java - hibernate DAO 错误

转载 作者:行者123 更新时间:2023-11-28 23:47:16 27 4
gpt4 key购买 nike

我正在为我的项目创建简单的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com