gpt4 book ai didi

grails - Grails 域类与继承之间的关系

转载 作者:行者123 更新时间:2023-12-02 14:42:38 24 4
gpt4 key购买 nike

我有以下类(class)。在 src/groovy ,

class Profile {
String firstName
String middleName
String lastName
byte[] photo
String bio
}

域类 BasicProfileAcademicProfile延长 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)。
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)。
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 (BasicProfileAcademicProfile )。我试过static hasOne = [profile: Profile]但我收到错误消息 Profile不同意hasOne关系。所以我目前的设置是一种解决方法。用户有没有办法拥有一个 ProfileBasicProfileAcademicProfile ?
  • 其次,在当前设置中,我收到错误: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 ,它应该可以正常工作。但我不想那样。因为一个出版物有很多作者(在我的例子中是 AcademicProfile),而一个作者可能有很多出版物。那么有没有办法解决这个问题?
  • 最佳答案

    您没有使用 Hibernate 继承 - 这需要映射所有类。您只是使用常规的 Java/Groovy 继承,从基类继承属性和方法。但是 Hibernate 并没有意识到这一点,所以它不能对未映射的基类进行查询。

    我不知道它为什么提示 AcademicProfile ,但它可能是由核心问题引起的次要错误。

    我发现 Hibernate 继承在大多数情况下使用起来太令人沮丧,所以当有共享代码时我会使用这种方法。

    如果您移动 Profile,它应该可以工作至grails-app/domain .一旦你这样做了,你应该移动 tablePerSubclass将配置映射到基类,并且只指定一次。

    关于grails - Grails 域类与继承之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26498631/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com