小编Jas*_*vak的帖子

使用Oracle 10g时,Hibernate对浮点列的模式验证的已知问题有哪些最佳解决方法?

我有几个带有双字段的Java类,我通过Hibernate持久化.例如,我有

@Entity
public class Node ...

  private double value;
Run Code Online (Sandbox Code Playgroud)

当Hibernate org.hibernate.dialect.Oracle10gDialect为Node表创建DDL时,它会将value字段映射为"double precision"类型.

create table MDB.Node (... value double precision not null, ...
Run Code Online (Sandbox Code Playgroud)

看起来在Oracle中,"double precision"是"float"的别名.因此,当我尝试使用该org.hibernate.cfg.AnnotationConfiguration.validateSchema()方法验证数据库模式时,Oracle似乎将值列描述为"float".这会导致Hibernate抛出以下异常

org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision
Run Code Online (Sandbox Code Playgroud)

Hibernate的JIRA数据库中列出了一个非常类似的问题,如HHH-1961.我想避免做任何会破坏MySql,Postgres和Sql Server支持的事情,因此扩展Oracle10gDialect似乎是HHH-1961中提到的最有希望的解决方法.但延伸一个方言是我以前从未做过的事情,我担心可能会有一些讨厌的问题.这个问题的最佳解决方法是什么,不会破坏我们与MySql,Postgres和Sql Server的兼容性?

java oracle orm hibernate

18
推荐指数
2
解决办法
9584
查看次数

OAuth 2.0 - 当资源所有者凭据无效时,为什么授权服务器返回400而不是401?

使用资源所有者密码授予类型时,如果由于资源所有者输入的密码不正确而无法授予访问令牌,则授权服务器似乎应响应HTTP 400(错误请求)状态代码.基于我对RFC 6749第5.2节**的理解,我得出了这个结论,其中说"在由于invalid_grant而无法授予令牌的情况下,授权服务器以HTTP 400(错误请求)状态代码响应".为invalid_grant列出的原因包括资源所有者凭据无效.

我的理解是否正确?如果是这样,为什么不返回HTTP 401(未授权)?使用基本身份验证时,无效密码会生成401.为什么OAuth 2.0规定要返回400?这是因为401是为无效的客户端凭据保留的吗?

**见http://tools.ietf.org/html/rfc6749#section-5.2

http oauth

14
推荐指数
2
解决办法
3232
查看次数

是否有可能获得Hibernate sqlRestriction的连接表的SQL别名?

我有一个Person类,它有一个别名的String集合,表示人可能经历的其他名称.例如,克拉克肯特可能有别名"超人"和"钢铁侠".德怀特霍华德也有别名"超人".

@Entity
class Person {

  @CollectionOfElements(fetch=FetchType.EAGER)
  Set<String> aliases = new TreeSet<String>();
Run Code Online (Sandbox Code Playgroud)

Hibernate在我的数据库中创建了两个表,Person和Person_aliases.Person_aliases是一个包含Person_id和element列的连接表.假设Person_aliases具有以下数据

--------------------------------
| Person_id     | element      |
--------------------------------
| Clark Kent    | Superman     |
| Clark Kent    | Man of Steel |
| Dwight Howard | Superman     |
| Bruce Wayne   | Batman       |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

我想为所有使用"超人"别名的人制作一个hibernate Criteria查询.

由于这里列出的原因太长,我真的想把它作为Criteria查询,而不是HQL查询(除非可以在Criteria对象上添加HQL限制,在这种情况下我可以全部听到)或者是原始的SQL查询.因为根据如何使用Hibernate Criteria在String集合中查询具有值的对象?使用CriteriaAPI引用值类型集合的元素是不可能的,我以为我会在我的条件对象上添加一个SqlRestriction.

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
Run Code Online (Sandbox Code Playgroud)

希望Hibernate能像这样创建一个SQL语句

    select *
from
    Person this_ 
left outer join
    Person_aliases aliases2_ 
        on this_.id=aliases2_.Person_id 
where
    XXXXX.element='superman' 
Run Code Online (Sandbox Code Playgroud)

但是,我需要在SQL查询中使用Person_aliases表的表别名填充XXXXX,在这种情况下,它将是'aliases2_'.我注意到如果我需要引用Person表别名,我可以使用{alias}.但这不起作用,因为Person是此Criteria的主表,而不是Person_aliases.

我要为XXXXX填写什么?如果没有像{alias}这样的好的替代令牌,那么我有没有办法让hibernate告诉我该别名会是什么?我注意到一个名为generateAlias()org.hibernate.util.StringHelper类的方法.这有助于我预测别名会是什么吗?

我真的非常想避免硬编码'aliases2_'.

谢谢你的时间!

java collections orm hibernate criteria

12
推荐指数
2
解决办法
2万
查看次数

Hibernate不允许带有int字段的嵌入对象为null?

Hibernate不允许我持久化包含带有整数字段的空嵌入对象的对象.例如,如果我有一个名为Thing的类看起来像这样

@Entity
public class Thing {

    @Id
    public String id;

    public Part part;

}
Run Code Online (Sandbox Code Playgroud)

Part是一个嵌入式类,看起来像这样

@Embeddable
public class Part {

    public String a;    

    public int b;

}
Run Code Online (Sandbox Code Playgroud)

然后尝试使用null Part持久保存Thing对象会导致Hibernate抛出异常.特别是这段代码

Thing th = new Thing();
th.id = "thing.1";
th.part = null;
session.saveOrUpdate(th);
Run Code Online (Sandbox Code Playgroud)

导致Hibernate抛出此异常

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.ace.moab.api.jobs.Thing.part
Run Code Online (Sandbox Code Playgroud)

我的猜测是发生了这种情况,因为Part是一个嵌入式类,所以Part.a和Part.b只是Thing数据库表中的列.由于Thing.part为null,Hibernate希望将thing.1的行的Part.a和Part.b列值设置为null.但是,Part.b是一个整数,Hibernate不允许数据库中的整数列为null.这是导致异常的原因,对吧?

所以我正在寻找这个问题的解决方法.我注意到使Part.b成为一个Integer而不是一个int似乎有效,但是由于我不会厌烦你,这对我们来说不是一个好选择.谢谢!

java orm hibernate jpa

11
推荐指数
1
解决办法
1万
查看次数

如何选择maven jar-with-dependencies的文件名?

我在maven生命周期的包阶段使用maven-assembly-plugin的jar-with-dependencies组件创建一个可执行jar.但是,我看不到配置输出jar的名称的方法.它似乎总是像

appname-1.1-r1011-jar-with-dependencies.jar 
Run Code Online (Sandbox Code Playgroud)

我怎么能把它配置成别的东西,比如也许

appname-1.1-r1011.jar
Run Code Online (Sandbox Code Playgroud)

这可能吗?

maven-2 maven-plugin

10
推荐指数
1
解决办法
4891
查看次数

Liquibase建议将生产数据从旧数据库模式迁移到新数据库模式吗?

我是数据迁移领域的新手,并研究如何使用OurApp 1.0将客户数据迁移到具有与OurApp 2.0兼容的模式的新数据库.我见过不止一些人推荐Liquibase用于数据库更改管理和数据库重构任务,这对我的新手来说听起来可能接近我们需要的东西.

但是,在阅读www.liquibase.org上的资料后,我感觉Liquibase更多的是保持模式最新,而不是转换大量现有数据,以便它可以保留在新模式中.

假设我想将名为name的Employee表中的列拆分为firstname和lastname列.Liquibase可以通过删除name列并添加firstname和lastname列来更改表.但是,我觉得Liquibase并不是真正为我构建的插入转换代码,它将数据库中现有记录的名称字段解析为firstname和lastname,并将它们存储在各自的列中.

例如,假设我的桌子看起来像这样

id | name             | position
*********************************
12   Horace Slughorn    Professor
13   Albus Dumbledore   Headmaster
Run Code Online (Sandbox Code Playgroud)

运行Liquibase之后,name列将被firstname和lastname列替换,因此我的数据库模式将是正确的.但我猜Liquibase不是一个框架,它允许我插入一些代码,将"Horace Slughorn"解析为"Horace"和"Slughorn",并将这些值存储在该记录的firstname和lastname列中.

id | firstname   |  lastname  | position
*****************************************
12   Horace         Slughorn         Professor
13   Albus          Dumbledore       Headmaster
Run Code Online (Sandbox Code Playgroud)

因此,Liquibase使您的架构保持最新,但不是为了帮助您转换现有数据以使其与新架构匹配.是对的吗?

data-migration liquibase

2
推荐指数
1
解决办法
4861
查看次数