我正在使用现有的数据库架构处理遗留代码库.现有代码使用SQL和PL/SQL在DB上执行查询.我们的任务是使项目数据库引擎不可知的一小部分(最初,最终改变一切).我们选择使用Hibernate 3.3.2.GA和"*.hbm.xml"映射文件(而不是注释).遗憾的是,更改现有架构是不可行的,因为我们无法回退任何遗留功能.
我遇到的问题是当我试图映射单向,一对多的关系时,FK 也是复合PK的一部分.这是类和映射文件......
CompanyEntity.java
public class CompanyEntity {
private Integer id;
private Set<CompanyNameEntity> names;
...
}
Run Code Online (Sandbox Code Playgroud)
CompanyNameEntity.java
public class CompanyNameEntity implements Serializable {
private Integer id;
private String languageId;
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" …Run Code Online (Sandbox Code Playgroud) 我想按照这个教程,但不是与我在它映射产生预期的hbm.xml文件中为我的实体,如例如产生简单的.cs类:
public class ProductMap : ClassMap<Product>
Run Code Online (Sandbox Code Playgroud)
但我已经在代码中定义了这些.我正在使用.hbm.xml,我现在可以在标准NHibernate中使用它.
这就是我设置SessionFactory的方法:
private static ISessionFactory CreateSessionFactory()
{
String schemaExportPath = Path.Combine(System.Environment.CurrentDirectory, "Mappings");
if (!Directory.Exists(schemaExportPath))
Directory.CreateDirectory(schemaExportPath);
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c =>c.FromConnectionStringWithKey("connectionString"))
.Cache(c => c.UseQueryCache()
.ProviderClass<HashtableCacheProvider>()).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>().ExportTo(schemaExportPath))
.ExposeConfiguration(c => new SchemaExport(c).SetOutputFile(@"c:\temp\test.sql").Create(false, true))
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud) 在由hibernate管理的实体上有一个长字段,对于null值可能是危险的.当Hibernate尝试将null设置为原语时,将抛出异常.
最佳解决方案应该是使用Long而不是long,因此可以将null分配给Long字段.
但是,我正在开发一个我们不能使用Long或Integer类型的项目.我想知道是否有办法覆盖hibernate类型以使用nullSafe方法或类似的东西.
我创建了一个仅用于获取数据的视图(只读)
查看:Grid_View
>我的Hibernate hbm文件
<hibernate-mapping>
<class name="hibernate.domain.View" table="Grid_View" mutable="false">
<property name="ACCT_BR_CD" type="string">
<column name="ACCT_BR_CD"/>
</property>
<property name="ACCT_NO" type="string">
<column name="ACCT_NO"/>
</property>
<property name="LGL_ENTY_NM" type="string">
<column name="LGL_ENTY_NM"/>
</property>
<property name="CUST_CTRY_CD" type="string">
<column name="CUST_CTRY_CD"/>
</property>
<property name="ACCT_SRC_SYS_CD" type="string">
<column name="ACCT_SRC_SYS_CD"/>
</property>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
>因为在我看来它们不是主键,我在映射中没有提到id字段. 但是在hibernate中,id是必需的.
>我的问题
如何在hibernate映射文件中继续没有id的映射.并且它们没有具有独特价值的列,因此没有任何机会将它们作为关键.请帮我解决这个问题
model-view-controller hibernate spring-mvc hibernate-mapping hbmxml
我收到此错误,我不知道我的hbm.xml文件有什么问题.我使用Eclipse Mars和Hibernate 5.0.2.
错误:
Nov 15, 2015 11:49:19 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.2.Final}
Nov 15, 2015 11:49:19 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Nov 15, 2015 11:49:19 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Nov 15, 2015 11:49:19 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
Nov 15, 2015 11:49:20 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Nov 15, 2015 11:49:20 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用hibernate将数据插入数据库。这是我要执行的动作
session.beginTransaction();
pojo.StuDetails stu = new StuDetails();
stu.setFName(f_name);
stu.setLName(l_name);
stu.setSex(sex);
stu.setDob(dob);
pojo.Subject sub = new Subject(subject, day, time);
pojo.SubjectHasStuDetails shs = new SubjectHasStuDetails(stu, sub);
session.save(shs);
session.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)
但这给我一个错误的说法
线程“主”中的异常org.hibernate.TransientPropertyValueException:非null属性引用了一个瞬态值-瞬态实例必须在当前操作之前保存
这是我的学生详细信息实体
public class StuDetails implements java.io.Serializable {
private Integer id;
private String FName;
private String LName;
private String sex;
private String dob;
private Set subjectHasStuDetailses = new HashSet();
...
//constructors and getters, setters
Run Code Online (Sandbox Code Playgroud)
我的学生详细信息hbm.xml
<hibernate-mapping>
<class name="pojo.StuDetails" table="stu_details" catalog="laravel_test" optimistic-lock="version">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="FName" …Run Code Online (Sandbox Code Playgroud)