Tag: orm

使用sql查询在hibernate中创建一个新的对象实例

我试图使用查询在hibernate中创建一个对象,然后将其保存回表示该类的表中。 摘自hbm.xml文件: MY_SEQ SELECT MY_SEQ.nextval ID, ‘something’ VAL from DUAL 测试用例的代码片段: MyClass myClass = (MyClass) session.getNamedQuery(“myQuery”).list().get(0); Transaction t = session.beginTransaction(); session.save(myClass); t.commit(); 我的目标是,现在应该在表MY_TABLE中有一个新记录,但插入不会发生,我认为这是因为Hibernate不知道实例没有在db中持久存在。 我试过将查询更改为: SELECT NULL ID, ‘something’ VAL from DUAL 但这导致Hibernate没有实例化对象。 那么如何从与该类的持久化实例无关的查询创建一个新的对象实例,并使用它来创建一个持久化的实例?

Hibernate Criteria API相当于HQL select子句?

我想对两个持久化类进行组合查询。 在HQL中,这可以通过select子句来实现, select new Family(mother, mate, offspr) from DomesticCat as mother join mother.mate as mate left join mother.kittens as offspr 在上面的例子中,Family是一个联合类,DemesticCat作为它的construtor params 什么是HQL select子句的Criteria等价物?

使用Dozer的自定义转换器将对象列表映射到另一个列表

我想要做的是使用Dozer将实体列表映射到它们的字符串ID列表(或多或少)。 显然,它意味着Custom Converter。 我的第一个想法是从MyEntity转换为String,然后对Dozer说“使用这个转换器映射此集合的每个对象”。 但我无法弄清楚如何做到这一点。 所以我的第二个想法是直接将转换器形成一个实体列表到一个字符串列表。 我对这个想法的问题是,我正在讨论一些荒谬的东西,即在构造函数中获取我的列表类型,如下所示(根本不起作用): public MyEntityListConverter() { super(List.class, List.class); } 我不知道如何在一行中传递一个实例化列表的类,而不会声明任何内容。 所以如果有人知道: 如何指定dozer一个在集合映射中使用的对象转换器 如何获取实例化列表类型 尝试的第三种/更好的解决方案

实体持久注册validation侦听器

我正在使用JBoss 6和Seam,我有一个我试图坚持的实体, User 。 我已经扩展了org.jboss.seam.framework.EntityHome以提供UserHome类并重写了persist()方法。 我用javax.validation注释彻底注释了我的实体类。 当我为实体类中的所有字段提供有效值时,该对象将保持不变。 当我违反其中一个validation约束时,持久性会按预期失败。 我遇到的问题是在异步持久化期间违反约束:hibernate没有告诉我哪个约束被违反了! javax.validation.ConstraintViolationException: validation failed for classes [com.example.model.User] duringpersist time for groups [javax.validation.groups.Default, ] at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:132) at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:71) 如果我通过向UserHome.persist()添加EntityManager.flush()来强制同步持久性,那么我可以捕获包含违反约束的ConstraintViolationException和输出日志语句。 我的问题:是否可以使用hibernate / jboss注册一个监听器来进行约束违规? 我认为hibernate没有打印违规行为有点蹩脚,但希望我可以插入一些代码来捕获并记录它们以获取更多信息。 否则我不知道违反了什么约束。 谢谢!

控制Hibernate EnumType.STRING属性的排序顺序

目前,我的项目使用@Enumerated(EnumType.ORDINAL) ,所以当我按此列排序时,它是根据enum的顺序进行排序,这很好。 但我需要在enum添加一些额外的值,这些值需要插入枚举值列表中的不同位置,并且不能仅添加到底部以维持正确的排序顺序。 如果我这样做,我的数据库将搞砸。 我将不得不编写一些脚本来将所有这些序数值转换为正确的新序数。 以后可能需要添加更多状态。 因为我必须修复数据库中的所有数据,所以我只想做一次,因为这将是一项艰巨的任务。 所以我想切换到EnumType.STRING ,不必再次重新映射数据库中的序号值。 但是,如果我这样做,那我该怎么排序呢? 枚举字符串的字母顺序不是我需要的顺序。 使用下面的类,当我按属性“status”排序时,结果按以下顺序排列: hql = “from Project order by status” Development Planning Production 我希望他们按此顺序出现,而不使用EnumType.ORDINAL : Planning Development Production 如果没有为enum创建表,或者向Project类添加其他列,是否可以这样做? 我试过这个,但它引发了一个exception: hql = “from Project order by status.sort” 枚举: public enum Status { PLANNING(“Planning”, 0), DEVELOPMENT(“Development”, 1), PRODUCTION(“Production”, 2); private final String name; private final int sort; […]

Spring Data JPA Repositories:是否可以给params一个默认的Value / default all?

因此,简而言之:是否可以将参数设置为“default:All”或更一般地将其设置为Spring Data JPA(可能是@ Query-Annotated)存储库方法中的默认特定值? 我知道在(Rest)控制器中设置默认值是可能的,我只是好奇它是否可以在Repository-Level中进行。 我认为可能是一个很好的function,因为“让我得到一些过滤结果集,其中filter可能没有在前端通过rest调用设置filter”是一个非常常见的用例。 例如查询: @Query(“select new com.my.dto(e.name, e.age, e.address)” + ” from Entity e” + “where e.name like ?1 ” + “and e.age like ?2 ” + “and e.street like ?3”) List findItemsFiltered(String name, String age, String street); 因此,当我们说没有设置street时,存储库应该使用“%”来返回其他条件匹配但街道不相关的所有结果。

Hibernate Annotations上的Assigned Generator类

这里有Hibernate新手。 我正在研究一个简单的Hibernate映射文件。 当我使用xml方法时,我将生成器类设置为已分配。 在分配员工ID之前必须检查某些逻辑,因此我无法自动生成它。 但是我也正在研究注释类型和注释似乎是现在的事情,因为框架正在逐渐远离配置文件。 但我找不到任何生成类型来匹配指定的值 public class Employee{ String id; @column(name=”emp_id”, unique=true) public String getID(){ return id; } } 这是否意味着我在分配时不需要添加任何序列生成器注释? 谢谢

如何在Hibernate Interceptor中获取Hibernate会话?

如何在Hibernate Interceptor中获取Hibernate会话? 我正在尝试使用Hibernate透明地通过组织ID强制执行数据访问。 我已经设置了一个全局filter来按组织ID过滤所有查询。 现在,我需要使用Entity拦截器在Save / Update之前在所有实体上设置Organizational Id。 组织ID来自HttpSession 我在Hibernate会话中将Organizational Id设置为Filter属性,我希望在拦截器中检索它并用于所有Inserts和Updates。 问题是我似乎无法访问拦截器内的Session。 这有什么变通方法吗?

从Hibernate 3迁移到4会降低启动速度

我们正在尝试将我们的项目从hibernate 3迁移到hibernate 4.一切都运行良好,但问题是启动。 我们不使用JPA,我们使用直接hibernate与xml文件和映射文件。 com.informix.jdbc.IfxDriver jdbc:informix-sqli://xxx:xxx/xxx:INFORMIXSERVER=xxx xxx xxx org.hibernate.dialect.InformixDialect true false dev.xml generated.mappingFile属性是一个自己的属性。 在启动时,将加载该文件(dev.xml)。 这个文件看起来像这样: … 我们减少了这篇文章中的映射数量。 我们目前有超过500个映射 。 使用hibernate 3 ,加载所有映射需要2秒钟 。 使用hibernate 4需要2分钟 。 这是来自hibernate 3.2.GA的日志文件: 07:36:21,293 INFO [HibernateManager ] | Verwende Mapping-Collection Datei : /com/cargosoft/csedi/data/mappings_dev.xml 07:36:21,347 INFO [HibernateManager ] | Adding this resource to hibernate now : com/cargosoft/csedi/data/aart/Aart_DEV.hbm.xml 07:36:21,443 INFO [HibernateManager ] […]

如何在使用JPA进行映射时增加mysql中String的长度

我在JPA遇到了一些麻烦。 如果有人能提供解决方案,我会非常感激。 用JPA(我使用的是MySQL DB),比方说,我有一个映射如下的类: @Entity class Employee{ int id; String employeeName; //getters and setters… } 映射到表时,我看到String在Mysql中使用varchar(255)映射。 但是,假设我有一个名字超过255个字符的员工,它会显示数据截断错误。 我知道我们可以通过在Employee列中添加“length”属性来解决这个问题: @column(length=1000) String employeeName; 这是唯一可行的方法吗? 我想,如果我们只是映射到java中的String,数据库将动态分配长度。