我正忙着将现有项目从Ant构建转换为使用Maven的项目.此构建的一部分包括使用hibernate hbm2java工具将.hbm.xml文件的集合转换为Java.这是用于执行此操作的Ant脚本的片段:
<target name="dbcodegen" depends="cleangen"
description="Generate Java source from Hibernate XML">
<hibernatetool destdir="${src.generated}">
<configuration>
<fileset dir="${src.config}">
<include name="**/*.hbm.xml"/>
</fileset>
</configuration>
<hbm2java jdk5="true"/>
</hibernatetool>
</target>
Run Code Online (Sandbox Code Playgroud)
我在互联网上看了一下,有些人似乎这样做(我认为)使用Maven中的Ant和Maven插件中的其他人.我宁愿避免混合Ant和Maven.任何人都可以建议一种方法来执行此操作,以便拾取所有.hbm.xml文件并生成代码作为Maven代码生成构建阶段的一部分吗?
谢谢!
亚当.
我正在尝试hbm2java使用maven 配置生成POJO类和DAO对象.我正在处理的一个问题是没有生成包名.我正在使用以下pom:
<execution>
<id>hbm2java</id>
<phase>generate-sources</phase>
<goals>
<goal>hbm2java</goal>
</goals>
<inherited>false</inherited>
<configuration>
<components>
<component>
<name>hbm2java</name>
<implementation>configuration</implementation>
</component>
</components>
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
</configuration>
</execution>
Run Code Online (Sandbox Code Playgroud)
然而,生成的代码从以下开始:
// default package
// Generated 2010-05-17 13:11:51 by Hibernate Tools 3.2.2.GA
/**
* Messages generated by hbm2java
*/
public class Messages implements java.io.Serializable {
Run Code Online (Sandbox Code Playgroud)
有没有办法强制maven生成packagename中定义的包部分?
更新:
这是我的hibernate.cfg.xml,也是由hibernate-tools(hbm2cfgxml)自动生成的:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property …Run Code Online (Sandbox Code Playgroud) 我正在使用hibernate3-maven-plugin来查询Oracle10g数据库并使用hbm2java目标生成带有JPA批注的Java类。然后,我使用spring配置一个会话工厂,该工厂扫描带注释的代码。
经过长时间的努力hbm2java,我设法生成了类,但现在又遇到了另一个问题:加载带注释的类时,出现“不允许在属性中混合可为空和不可为空的列”的异常。
数据库定义表FOO和BAR如下:
CREATE TABLE FOO (
STATUS_CODE ... NOT NULL,
REASON_CODE ...);
ALTER TABLE FOO ADD (
CONSTRAINT FK_BAR
FOREIGN KEY (REASON_CODE, STATUS_CODE)
REFERENCES BAR(REASON_CODE, STATUS_CODE));
CREATE TABLE BAR (
STATUS_CODE ... NOT NULL,
REASON_CODE ... NOT NULL);
ALTER TABLE BAR (
PRIMARY KEY (REASON_CODE, STATUS_CODE));
Run Code Online (Sandbox Code Playgroud)
因此,表FOO具有两列,它们是表BAR中的外键。列FOO.STATUS_CODE必须为非空,但列FOO.REASON_CODE可以为空。这里的逻辑是FOO需要一个状态,但并非每个状态都需要一个原因。
表BAR具有列BAR.REASON_CODE和BAR.STATUS_CODE,它们都不为空。此处的逻辑将各种(但不是全部)状态代码的原因关联在一起。因此,例如,如果状态为“已取消”,则原因可能是“欺诈”,“无能”等。
注意,诸如“活动”的状态没有任何关联的原因,因此在表BAR中不存在,但是它可以作为状态代码出现在表FOO中(没有关联的原因代码)。但是,如果FOO中的行的状态代码为“已取消”,则它还必须具有表BAR中为该状态定义的原因代码之一。
因此,表定义对我来说似乎不错(尽管我不是数据库专家)。
现在hbm2java,maven中的目标为表FOO生成以下代码:
private Bar bar;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns( {
@JoinColumn(name="REASON_CODE", referencedColumnName="REASON_CODE"),
@JoinColumn(name="STATUS_CODE", referencedColumnName="STATUS_CODE", nullable=false) } )
public Bar getBar() {
return …Run Code Online (Sandbox Code Playgroud) hibernate hbm2java hibernate-annotations hibernate3-maven-plugin
我当前使用 hibernate 的设置使用该hibernate.reveng.xml文件生成各种hbm.xml文件。然后使用hbm2java. 我们在设计模式时花了一些时间,在表和列上放置了一些相当不错的描述。我能这些描述来拉入hbm.xml使用它们生成文件时hbm2jhbmxml。
所以我得到了类似的东西:
<class name="test.Person" table="PERSONS">
<comment>The comment about the PERSONS table.</comment>
<property name="firstName" type="string">
<column name="FIRST_NAME" length="100" not-null="true">
<comment>The first name of this person.</comment>
</column>
</property>
<property name="middleInitial" type="string">
<column name="MIDDLE_INITIAL" length="1">
<comment>The middle initial of this person.</comment>
</column>
</property>
<property name="lastName" type="string">
<column name="LAST_NAME" length="100">
<comment>The last name of this person.</comment>
</column>
</property>
</class>
Run Code Online (Sandbox Code Playgroud)
那么我如何告诉hbm2java在创建的 Java 文件中提取和放置这些注释呢?
我已阅读过此有关编辑freemarker的模板来更改生成代码的方式。我理解这个概念,但没有详细说明除了前置条件和后置条件示例之外你还能用它做什么。
我正在使用Hibernate,Maven和Eclipse(STS构建)来构建项目.我正在使用hbm.xml文件来指定我的架构.我想使用Hibernate的hbm2java来生成我的模型类.我有它运作良好,并生成我想要的代码类型.
它从命令行完美运行,生成模型代码,然后按预期构建和测试.
但是,Eclipse似乎无法处理它.它将定期"失去理智"并且无法解决我的DAO类中引用的非常简单的导入和类,这些类是手动编码的.它找不到的东西是像HibernateUtil这样的类.具有讽刺意味的是,它似乎没有找到模型类的麻烦.
未解析的类在运行结束时位于target/classes/blah-blah文件夹中.所以他们显然被复制到了正确的地方.
在"持续集成"环境中,最好是生成一次源,将它们提交到我的版本控制,然后禁用代码生成?或者是否可以每次生成代码,从而确保我在没有人为干预的情况下获取任何数据库更改?