我正在使用HQL命名查询(在XML文件中定义)来使用Hibernate查询我的数据库.有些查询非常复杂,我发现自己将一个查询的大部分内容复制粘贴到另一个查询,类似的查询.
我想知道是否有可能在"命名查询片段"中定义公共部分并在我的所有查询中重用该片段?
我不想使用标准API,顺便说一句,因为我觉得在XML中制定查询更加舒服.其中一些已经是一个非常怪物,用API实现它们会使它们更加难以理解.
我正在使用Hibernate和Xml映射.我有一个实体有两个字段creationDate和updateDate类型timestamp,当实体被持久化和更新时,必须填充当前的UTC时间.我知道@PrePersist和@PreUpdate注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物.
再一次,我想知道Hibernate是否以某种方式支持本地更新和创建时间设置.
谢谢
我有一个基本的Customer/Order/OrderItem/Product对象图.客户有多个订单,订单有多个订单商品,产品有许多订单商品.使用FNH成功映射了这些.
我遇到了配置存储过程和fluent-nhibernate的问题.在fluent-hibernate FNH(版本1.0 RTM)中,没有一种本地方法可以映射存储过程.这里有一个关于向类映射添加部件的解决方案,但AddPart调用已经从FNH的发布中取出.
存储过程很简单:
CREATE PROCEDURE [dbo].[OrderCountByCustomer]
AS
BEGIN
SET NOCOUNT ON;
SELECT
c.name as [Customer.Name],
CAST(count(o.id) as NVARCHAR) as [Customer.OrderCount]
FROM customer c
LEFT OUTER JOIN [order] o
ON o.customer_id = c.id
GROUP BY c.name
END
Run Code Online (Sandbox Code Playgroud)
在中有一个CustomerOrderSummary.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NVAble.Orders.Core" namespace="NVAble.Orders.Core">
<sql-query name="OrderSummary">
<return class="CustomerOrderSummary">
<return-property column="Customer.Name" name="CustomerName" />
<return-property column="Customer.OrderCount" name="OrderCount" />
</return>
EXEC [OrderCountByCustomer]
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
这是CustomerOrderSummary类def:
namespace NVAble.Orders.Core
{
public class CustomerOrderSummary
{
virtual public string CustomerName { get; …Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试映射这个pojo Rent类来创建他的hibernate映射文件.
Rent.java(POJO):
public class Rent implements Serializable {
private static final long serialVersionUID = 1L;
Employee employee;
Client client;
Car car;
/* + getter and setter... */
}
Run Code Online (Sandbox Code Playgroud)
我的目的是创建一个web应用程序,用户可以设置哪个员工租了一辆车到客户端.所以这是我试过的实现
Rent.hbm.xml:
<hibernate-mapping>
<class name="com.google.musicstore.domain.Rent" table="RENT">
<id name="id" column="RENT_ID">
<generator class="native"/>
</id>
<one-to-one name="car" class="com.project.domain.Car"
cascade="save-update">
</one-to-one>
<one-to-one name="client" class="com.project.domain.Client"
cascade="save-update">
</one-to-one>
<many-to-one name="employee" class="com.project.domain.Employee"
cascade="save-update">
</many-to-one>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误:
[java] Initial SessionFactory creation failed.org.hibernate.MappingException: An association from the table RENT refers to an unmapped class: com.project.domain.Employee
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?感谢您的帮助.
我还映射了hibernate.cfg.xml …
我可以在NHibernate 4.0中看到新的和修复的内容
我想知道是否有人遇到从NHibernate 3升级到4的hbm映射问题?
我担心这些日子会更加注重流畅的绘图.我可以测试更明显的重大变化,但想知道是否有任何人在生产环境中遇到的任何细微问题,一开始可能不那么明显.
它看起来像是一次重大升级,你可能会有回归的风险.
我正在努力让我的存储过程与NHibernate一起工作.从SP返回的数据与任何数据库表都不对应.
这是我的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Entities">
<sql-query name="DoSomething">
<return class="SomeClass">
<return-property name="ID" column="ID"/>
</return>
exec [dbo].[sp_doSomething]
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
这是我的域类:
namespace DomainModel.Entities
{
public class SomeClass
{
public SomeClass()
{
}
public virtual Guid ID
{
get;
set;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它失败了
Exception Details: NHibernate.HibernateException: Errors in named queries: {DoSomething}
Run Code Online (Sandbox Code Playgroud)
在第80行
Line 78: config.Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "NHibernate.config"));
Line 79:
Line 80: g_sessionFactory = config.BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)
当我调试NHibernate代码时,似乎SomeClass没有添加到persister字典中,因为hbm.xml中没有定义类映射(只有sql-query).后来在CheckNamedQueries函数中,它无法找到SomeClass的persistor.
我已经检查了所有显而易见的事情(例如将hbm作为嵌入式资源)并且我的代码与我在网络上找到的其他示例没有太大的不同,但不知怎的,我无法让它工作.知道如何解决这个问题吗?
因为以下Nhibernate问题,我整天都在用桌子敲打桌子.
每个银行帐户都有一组(且只有一组)与之关联的费率.银行帐户表的主键BankAccountID也是外键和AccountRate表中的主键.
public class BankAccount
{
public virtual int BankAccountId { get; set; }
public virtual string AccountName { get; set;}
public virtual AccountRate AccountRate {get;set;}
}
public class AccountRate
{
public virtual int BankAccountId { get; set; }
public virtual decimal Rate1 { get; set; }
public virtual decimal Rate2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我为BankAccount提供了以下HBM映射:
<class name="BankAccount" table="BankAccount">
<id name ="BankAccountId" column="BankAccountId">
<generator class="foreign">
<param name="property">
AccountRate
</param>
</generator>
</id>
<property name ="AccountName" column="AccountName" />
<one-to-one name="AccountRate" class="AccountRate" …Run Code Online (Sandbox Code Playgroud) 我有一个包含许多字段的数据库表,当我使用Hibernate .hbm文件为该表生成POJO时会导致问题.问题是生成的完整构造函数为Java生成了太多的参数,这会引发编译器错误:
参数太多,参数xxxx超出了可用于方法参数的255个字的限制
我想通过抑制Hibernate生成完整构造函数来解决这个问题.我的问题是
提前感谢您的任何答案.
我正在使用Net Beans IDE,当我开始部署我的Web项目时,它会在控制台输出中显示错误信息:
failed.org.hibernate.MappingException: Could not determine type for: String, for columns: [org.hibernate.mapping.Column(db col name)
Run Code Online (Sandbox Code Playgroud)
从消息中它无法转换类型; 我试图检查我的文件.hbm和.java中的类型,但到目前为止没有运气.
抛出此错误的属性定义为
<property name="exemptionOwnerName1" type="String">
Run Code Online (Sandbox Code Playgroud) 我有一个问题,我正在向nServiceBus发送一条消息数据字段为可变长度的消息.nServiceBus正在使用nHibernate来创建一个名为的表
[NServiceBus].[PendingMentorEmailSagaData]
Run Code Online (Sandbox Code Playgroud)
来自一个名为PendingMentorEmailSagaData的类.然而,消息字段被设置为nvarchar(255),我正在寻找一种方法将它设置为nvarchar(MAX).
我尝试过使用嵌入式hbm文件,但是出现了" persistent class PendingMentorEmailSagaData not found"错误.
这可能意味着我无法弄清楚要设置文件的类.
hbm文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="PendingMentorEmailSagaData">
<id name="Id" />
<property name="OriginalMessageId" />
<property name="Originator" />
<property name="PendingMentorEmailCommandId" />
<property name="JobBoardCode" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
PendingMentorEmailSagaData是saga数据类的名称.
调用session.GetNamedQuery()时,我一直得到一个"命名查询未知"的MappingException.我正在使用Fluent和NHibernate 3.0,我在hbm.xml文件中有查询.为了简单起见,我在同一个程序集中拥有所有内容.我已将xml文件上的Build Action设置为"Embedded Resource".
我的配置如下所示:
var nhConfig = Fluently.Configure()
.Database(SQLAnywhereConfiguration
.SQLAnywhere10
.ConnectionString("uid='dba'; pwd='sql'; dsn=db"))
.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "thread_static"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Party>())
.BuildConfiguration();
var sessionFactory = nhConfig.BuildSessionFactory();
ISession session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
NHibernate.IQuery q = session.GetNamedQuery("GetFirstParty");
Run Code Online (Sandbox Code Playgroud)
我的GetFirstParty.hbm.xml文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<query name="GetFirstParty">
<![CDATA[from Party p where p.CaseNumber = :CaseNumber]]>
</query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我在这里失踪了什么?
请帮忙.
谢谢,
麦克风
目前要求我将 POJO 休眠注释转换为 hbm.xml 文件,
但我遇到了两个我无法“翻译”的注释,并且没有找到我的问题的完整答案,
我应该使用什么级联类型来反映以下内容:1)
@Cascade({CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.SAVE_UPDATE })
Run Code Online (Sandbox Code Playgroud)
2)
@Cascade({CascadeType.MERGE})
Run Code Online (Sandbox Code Playgroud)
提前致谢。
hbm ×13
nhibernate ×7
hibernate ×6
c# ×2
hql ×1
jakarta-ee ×1
java ×1
named-query ×1
nhibernate-3 ×1
nhibernate-4 ×1
nservicebus ×1
one-to-one ×1
orm ×1
pojo ×1
session ×1