0

当使用实体继承层次结构时,@DiscriminatorColumn 在 MySQL ENUM 中存储 DiscriminatorType.STRING 值。下面的代码示例:

    @Entity
    @DiscriminatorColumn(name ="account_type", discriminatorType = DiscriminatorType.STRING,
         columnDefinition = "ENUM('natural_person', 'firm', 'provider', 'employee', 'administrator', 'moderator', 'user')")
@DiscriminatorValue("user")
public class User implements Serializable { ... } 

和继承的实体:

@Entity 
@DiscriminatorValue("firm")
public class Firm extends User { ... } 

当我创建 Firm 对象或删除一切正常时,即使我使用 EntityManager 找到它,但如果我创建 EnityManager.refresh(firm),则会出现以下错误:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'firm0_.account_type' in 'field list'

更新:

当我通过删除它并存储字符串“firm”、“user”来更改 @DecriminatorColumn 的此 columnDefinition 时,错误也发生了!

更新 2:

我有一点建议,随着公司扩展 UserAccount,这个鉴别器列account_type应该在user_account表中。所以错误firm0.account_type 似乎很愚蠢,因为它在user_account.account_type 中搜索此列!我有另一个子类Person并且它仍然存在并且保存好,但Firm只存在,删除但不要刷新!

生成的列:user_account

更新 3:

找到这样的sql日志:

    Hibernate: 
    insert 
    into
        user_account
        (activation_code, email, last_failed_login, last_logged, login, password, registration_date, account_type) 
    values
        (?, ?, ?, ?, ?, ?, ?, 'firm')
Hibernate: 
    insert 
    into
        firm
        (address_city, address_country, address_office_no, address_building_no, address_state, address_street, address_zip_code, client_id, company_number, name, phone_number, skype_name, statistic_number, vatin, user_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    select
        firm0_.user_id as user_id2_14_0_,
        firm0_1_.activation_code as activati3_14_0_,
        firm0_1_.email as email4_14_0_,
        firm0_1_.last_failed_login as last_fai5_14_0_,
        firm0_1_.last_logged as last_log6_14_0_,
        firm0_1_.login as login7_14_0_,
        firm0_1_.password as password8_14_0_,
        firm0_1_.registration_date as registra9_14_0_,
        firm0_.address_city as address_1_3_0_,
        firm0_.address_country as address_2_3_0_,
        firm0_.address_office_no as address_3_3_0_,
        firm0_.address_building_no as address_4_3_0_,
        firm0_.address_state as address_5_3_0_,
        firm0_.address_zip_code as address_7_3_0_,
        firm0_.client_id as client_15_3_0_,
        firm0_.company_number as company_8_3_0_,
        firm0_.name as name9_3_0_,
        firm0_.skype_name as skype_n11_3_0_,
        firm0_.statistic_number as statist12_3_0_,
        firm0_.vatin as vatin13_3_0_,
        firm0_2_.corporation_id as corporat5_8_0_,
        firm0_2_.description as descript1_8_0_,
        firm0_2_.name as name2_8_0_,
        firm0_2_.type as type3_8_0_,
        firm0_.account_type as account_1_14_0_ 
    from
        firm firm0_ 
    inner join
        user_account firm0_1_ 
            on firm0_.user_id=firm0_1_.user_id 
    left outer join
        provider firm0_2_ 
            on firm0_.user_id=firm0_2_.provider_id 
    where
        firm0_.user_id=?
Jun 10, 2015 5:37:16 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1054, SQLState: 42S22
Jun 10, 2015 5:37:16 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Unknown column 'firm0_.account_type' in 'field list'
Jun 10, 2015 5:37:16 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool
4

2 回答 2

0

我猜当 JPA 生成 DDL 时,它使用 columnDefinition 字符串作为列定义的文字。因此,应该是"account_type ENUM('natural_person', 'firm', 'provider', 'employee', 'administrator', 'moderator', 'user')"

于 2015-06-10T15:05:12.993 回答
0

好的,我似乎找到了解决方案,但这很奇怪,稍后我将对其进行测试。

private String accountType; 

@Column(name = "account_type", insertable = false, updatable = false)
public String getAccountType() {
    return accountType;
}

public void setAccountType(String accountType) {
    this.accountType = accountType;
}

我已将此代码添加到 UserAccount (超类 - 继承层次结构的根)中,其中定义了鉴别器列......但是在实体中定义显式鉴别器列似乎很奇怪!我读到它是反模式,不建议添加,而且在代码中使用这样的鉴别器列......

于 2015-06-10T16:12:03.587 回答