我有几个带有双字段的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的兼容性?
使用资源所有者密码授予类型时,如果由于资源所有者输入的密码不正确而无法授予访问令牌,则授权服务器似乎应响应HTTP 400(错误请求)状态代码.基于我对RFC 6749第5.2节**的理解,我得出了这个结论,其中说"在由于invalid_grant而无法授予令牌的情况下,授权服务器以HTTP 400(错误请求)状态代码响应".为invalid_grant列出的原因包括资源所有者凭据无效.
我的理解是否正确?如果是这样,为什么不返回HTTP 401(未授权)?使用基本身份验证时,无效密码会生成401.为什么OAuth 2.0规定要返回400?这是因为401是为无效的客户端凭据保留的吗?
我有一个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_'.
谢谢你的时间!
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似乎有效,但是由于我不会厌烦你,这对我们来说不是一个好选择.谢谢!
我在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)
这可能吗?
我是数据迁移领域的新手,并研究如何使用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使您的架构保持最新,但不是为了帮助您转换现有数据以使其与新架构匹配.是对的吗?