我正在使用目标hibernate3-maven-plugin
查询 Oracle10g 数据库并生成带有 JPA 注释的 java 类hbm2java
。然后我使用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));
所以表 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 this.bar;
}
请注意,这里只有 STATUS_CODE 列不可为空。
但是,当创建休眠会话工厂 bean 并扫描带注释的类时,会生成“不允许在属性中混合可空和不可空列”异常。
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)
问题
这是休眠注释处理代码引发的有效错误(在这种情况下,数据库中的表定义需要更改),还是无效?如果是后者,我可以将会话工厂代码配置为忽略此类错误吗?
配置
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>