Hibernate错误:在hbm2java代码上混合可空和不可空属性

Hibernate错误:在hbm2java代码上混合可空和不可空属性,hibernate,hibernate-annotations,hbm2java,hibernate3-maven-plugin,Hibernate,Hibernate Annotations,Hbm2java,Hibernate3 Maven Plugin,我正在使用hibernate3maven插件查询Oracle10g数据库,并使用hbm2java目标生成带有JPA注释的java类。然后,我使用spring配置一个会话工厂来扫描带注释的代码 在与hbm2java进行了长期斗争之后,我成功地生成了我的类,但现在我遇到了另一个问题:当加载带注释的类时,我遇到了一个“在属性中混合可为null的列和不可为null的列是不允许的”异常 数据库对表FOO和BAR的定义如下: CREATE TABLE FOO ( STATUS_CODE ... NOT

我正在使用
hibernate3maven插件
查询Oracle10g数据库,并使用
hbm2java
目标生成带有JPA注释的java类。然后,我使用spring配置一个会话工厂来扫描带注释的代码

在与
hbm2java
进行了长期斗争之后,我成功地生成了我的类,但现在我遇到了另一个问题:当加载带注释的类时,我遇到了一个“在属性中混合可为null的列和不可为null的列是不允许的”异常

数据库对表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));
因此,表FOO有两列,它们是表栏中的外键。列FOO.STATUS\u代码必须为非null,但列FOO.REASON\u代码可能为null。这里的逻辑是一个FOO需要一个状态,但不是每个状态都需要一个原因

表格栏中有BAR.REASON\u CODE和BAR.STATUS\u CODE列,这两个列均为非空。这里的逻辑关联了各种(但不是全部)状态代码的原因。因此,例如,如果状态为“取消”,则原因可能是“欺诈”、“不称职”等

请注意,“活动”等状态没有任何关联的原因,因此不存在于表格栏中,但它可以作为状态代码出现在表格FOO中(没有关联的原因代码)。但是,如果FOO中的一行的状态代码为“已取消”,则该行还必须具有在表格栏中为该状态定义的一个原因代码

因此,表定义对我来说似乎很好(尽管我不是数据库专家)

现在,maven中的
hbm2java
目标为表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 this.bar;
}
请注意,此处只有STATUS_CODE列不可为空

但是,当创建hibernate会话工厂bean并扫描带注释的类时,将生成“不允许在属性中混合可为null的列和不可为null的列”异常

Caused by: org.hibernate.AnnotationException: Mixing nullable and non nullable columns in a property is not allowed: com.whatever.domain.LnrPermissionlnrPermStatusReason
  at org.hibernate.cfg.Ejb3Column.checkPropertyConsistency(Ejb3Column.java:514)
  at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2568)
  at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1527)
  at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:769)
  at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733)
  at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:636)
问题

这是hibernate注释处理代码引起的有效错误(在这种情况下,数据库中的表定义需要更改),还是无效?如果是后者,我可以将会话工厂代码配置为忽略此类错误吗

配置

Maven依赖项:

  • org.hibernate/hibernate-core/3.5.6-Final
  • org.hibernate/hibernate-annotations/3.5.6-Final
  • org.springframework/spring-orm/3.1.2-RELEASE
Spring应用程序上下文:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.whatever.domain" />
</bean>

您能找到解决方案吗??我在生成POJO类时也遇到过这种问题