我有以下类(class)。在src/groovy
中,
class Profile {
String firstName
String middleName
String lastName
byte[] photo
String bio
}
域类
BasicProfile
和AcademicProfile
扩展了Profile
。class BasicProfile extends Profile {
User user
Date dateCreated
Date lastUpdated
static constraints = {
firstName blank: false
middleName nullable: true
lastName blank: false
photo nullable: true, maxSize: 2 * 1024**2
bio nullable: true, maxSize: 500
}
static mapping = {
tablePerSubclass true
}
}
class AcademicProfile extends Profile {
User user
String dblpId
String scholarId
String website
Date dateCreated
Date lastUpdated
static hasMany = [publications: Publication]
static constraints = {
importFrom BasicProfile
dblpId nullable: true
scholarId nullable: true
website nullable: true, url: true
publications nullable: true
}
static mapping = {
tablePerSubclass true
}
}
然后是一个
Publication
类。class Publication {
String dblpId
String scholarId
String title
String description
Date publicationDate
int citations
Date dateCreated
Date lastUpdated
static belongsTo = [AcademicProfile]
static hasOne = [publisher: Publisher]
static hasMany = [academicProfiles: AcademicProfile]
static constraints = {
dblpId nullable: true
scholarId nullable: true
title blank: false, maxSize: 100
description nullable: true, maxSize: 500
publicationDate: nullable: true
academicProfiles nullable: false
}
}
最后,我有一个
User
类。class User {
String username
String password
String email
Date dateCreated
Date lastUpdated
static hasOne = [basicProfile: BasicProfile, academicProfile: AcademicProfile]
static constraints = {
username size: 3..20, unique: true, nullable: false, validator: { _username ->
_username.toLowerCase() == _username
}
password size: 6..100, nullable: false, validator: { _password, user ->
_password != user.username
}
email email: true, blank: false
basicProfile nullable: true
academicProfile nullable: true
}
}
我的问题如下。
User
可以选择具有Profile
(BasicProfile
或AcademicProfile
)。我尝试了static hasOne = [profile: Profile]
,但出现错误,说Profile
与hasOne
关系不同。所以我当前的设置是一种解决方法。用户是否无法拥有一个Profile
或BasicProfile
? AcademicProfile
。 Google搜索告诉我这是从其他类继承的类的问题。因此,从技术上讲,如果我在Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table academic_profile_publications refers to an unmapped class: org.academic.AcademicProfile
和hasMany
中没有Publication
关系,它应该可以正常工作。但是我不想要那个。因为出版物有很多作者(在我的情况下为AcademicProfile
),并且作者可能有很多出版物。那么有没有办法解决这个问题? 最佳答案
您没有使用Hibernate继承-要求映射所有类。您只是在使用常规Java / Groovy继承,而在此继承自基类的属性和方法。但是Hibernate并不知道这一点,因此它无法对未映射的基类进行查询。
我不确定为什么要抱怨AcademicProfile
,但是它可能是由核心问题引起的次要错误。
我发现Hibernate继承在大多数情况下都太令人沮丧而无法使用,因此在存在共享代码时我会使用这种方法。
如果将Profile
移到grails-app/domain
,它应该可以工作。完成后,应将tablePerSubclass
映射配置移动到基类,并仅指定一次。