Java 映射旧模型-只有具有唯一约束的表才能用作域类?
我试图映射一个只有唯一键的表(Oracle Forms time的遗留表),因为有些值可以为null。用户可以选择其他应用程序中的数据是否以char或number形式存在,并且该表有两个字段(一个varchar2和另一个number) 是否可以为此使用域类 范例Java 映射旧模型-只有具有唯一约束的表才能用作域类?,java,oracle,grails,gorm,Java,Oracle,Grails,Gorm,我试图映射一个只有唯一键的表(Oracle Forms time的遗留表),因为有些值可以为null。用户可以选择其他应用程序中的数据是否以char或number形式存在,并且该表有两个字段(一个varchar2和另一个number) 是否可以为此使用域类 范例 Mytable --------------------------------------------------------------- office_schedule_id NUMBER(5) NOT NULL o
Mytable
---------------------------------------------------------------
office_schedule_id NUMBER(5) NOT NULL
office_company_char VARCHAR2(6)
office_schedule_char VARCHAR2(10)
office_company_num NUMBER(6)
office_schedule_num NUMBER(5)
default VARCHAR2(1)
唯一约束由除“默认”之外的所有字段组成
我试过这个:
class OfficeSchedule {
int officeScheduleId
String officeScheduleName
static mapping = {
version false
table 'office_schedules'
id column: 'office_schedule_id', name: 'officeScheduleId'
}
static hasMany = [ schedules : IntegrationSchedules ]
}
//this represents MyTable
class IntegrationSchedules {
String officeCompanyChar
String officeScheduleChar
Integer officeCompanyNum
Integer officeScheduleNum
String default
static belongsTo = [ officeSchedule : OfficeSchedule ]
int hashCode() {
def builder = new HashCodeBuilder()
//added all fields of the unique key
builder.toHashCode()
}
static mapping = {
version false
table 'mytable'
id composite: ['officeSchedule','officeCompanyChar','officeScheduleChar','officeCompanyNum','officeScheduleNum']
officeSchedule(column:'office_schedule_id')
}
}
当我尝试查询时,56条记录中只有5条返回
println IntegrationSchedules.findAll().size() //prints 5 but table have 56
我试图删除与OfficeSchedule的关系,但仍然只返回五行
然后我注意到返回的行是因为它们通知了所有字段,这是有意义的,因为我将键定义为PK
我无法更改该表,因为有使用它的旧应用程序
我认为一种解决方法是将其转换为groovy bean,并使用服务创建对象,但有了这种方法,我无法使用criteria和GORM findBy方法。您最好的办法是查看hibernate文档(并进行谷歌搜索),以找到一种机制,将其映射到普通hibernate中。一旦在hibernate中有了一个解决方案(hibernate非常努力地保持灵活性,以便可以在遗留数据库上使用),然后返回gorm并尝试确定gorm是否公开相同的功能。至少,它可能允许您构造一个邮件列表查询,该查询将生成本次查询没有的响应。有很多gorm没有很好的文档记录,因此了解gorm DSL如何映射到hibernate配置对于有根据地猜测如何在gorm中实现至关重要。正如@ideascultor所提到的,我的解决方案是创建hibernate映射: src/java/domain
@Entity
@Table(name = "mytable")
class IntegrationSchedules {
@Id()
@Type(type="string")
@Column(name="rowid")
private String rowid;
private String officeCompanyChar
private String officeScheduleChar
private Integer officeCompanyNum
private Integer officeScheduleNum
private String default
//getters & setters ommited
}
我必须创建一个hibernate配置(conf/hibernate中的hibernate.cfg.xml)
缺少约束块。这可能是个问题,因为如果没有字段,默认情况下字段不可为空。你能试着加一个吗?另外,如果office_schedule_id是唯一的,那么它可以单独作为您的PK。如果我没有弄错的话,那么这些约束只用于验证域类。在我的例子中,我只是从数据库中检索数据。唯一约束由除“default”之外的所有字段组成,因此我不能将office\u schedule\u id用作PK。
<!DOCTYPE hibernate-configuration SYSTEM
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping package="domain" />
<mapping class="domain.IntegrationSchedules" />
</session-factory>
</hibernate-configuration>
IntegrationSchedules.findAll()