我正在尝试找到此问题的解决方案:

数据库中有一个表(code_list),其中包含所有类似enum的数据。

假设我们有一个Affiliate,可以有一个AffiliateTypeLanguageCode

我们将所有这些内容放在code_list表中,其中id_code_list字段告诉我们我们是在谈论AffiliateType还是Languagecode,我们可以使用StringInteger标识符来告诉我们哪个AffiliateType我们正在交谈。

表中数据的示例:

    | id_code_list | val_num | val_string | label  |
    | :----------: |:------: |:---------: | :-----:|
    | TYP_AFF      | 3       | 3          | Other  |
    | TYP_AFF      | 1       | 1          | Divers |
    | COD_LAN      | 1       | 1          | French |


我试图这样映射:
代码列表父级

@Entity
@Table(name = "CODE_LIST")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ID_CODE_LIST")
public abstract class CodeListString {

    @Id
    @Column(name = "VAL_STRING")
    protected String value;

    @Embedded
    protected Label label;
...


会员类型:

@Entity
@DiscriminatorValue("TYP_AFF")
public class AffiliateType extends CodeListString{

    public static final AffiliateType SOCIAL_SECRETARIAT = new AffiliateType("1");
    public static final AffiliateType VARIOUS_SERVICES = new AffiliateType("2");
    public static final AffiliateType OTHERS = new AffiliateType("3");
    public static final AffiliateType SOPA = new AffiliateType("9");

    public AffiliateType() {}

    private AffiliateType(String value) {
        super(value);
    }
}


而我的Affiliate实体:

@Entity
@Table(name = "AFF")
public class Affiliate {
    @ManyToOne
    @JoinColumn(name = "TYP_AFF")
    private AffiliateType type;


但我收到此错误:


  org.hibernate.MappingException:外键(FK7re97tvvbbo2km961gy9b5jw6:aff [typ_aff]))必须具有与引用的主键相同的列数(code_list [val_string,id_code_list])


那么,有没有办法使这项工作奏效,或者您有解决此问题的其他解决方案?

PS:我正在使用Hibernate和类似的解决方案

@ManyToOne(targetEntity = AffiliateType.class)
@JoinColumn(name = "TYP_AFF")
@Where(clause = "ID_CODE_LIST='TYP_AFF'")
private AffiliateType type;


不行...

最佳答案

我已经删除了对自定义库的依赖,并且可以正常工作。

我无法在一个干净的项目上重现此错误。

无论如何,这个解决方案真的很慢!

10-01 00:55