Java JPA/Hibernate抱怨继承子类时存在重复映射

Java JPA/Hibernate抱怨继承子类时存在重复映射,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,Java 8和MySQL,在使用对象继承模型进行JPA/Hibernate schedma验证时遇到一些问题。我将Hibernate设置为“验证模式”(也就是说,它应该只针对现有的DB结构验证我的Java类及其JPA/Hibernate注释) 我的Java类: // All my Java entities extend BaseEntity which just contains a few fields that // all my DB tables will also have. @Ma

Java 8和MySQL,在使用对象继承模型进行JPA/Hibernate schedma验证时遇到一些问题。我将Hibernate设置为“验证模式”(也就是说,它应该只针对现有的DB结构验证我的Java类及其JPA/Hibernate注释)

我的Java类:

// All my Java entities extend BaseEntity which just contains a few fields that
// all my DB tables will also have.
@MappedSuperclass
@Data
@EqualsAndHashCode(callSuper=false)
public abstract class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String refId;

}

// Base class for several Org subclasses. I would like these subclasses to all share
// the same "organizations" table under the hood
@Entity
@Table(name = "organizations")
@AttributeOverrides({
    @AttributeOverride(name = "id", column = @Column(name = "organization_id")),
    @AttributeOverride(name = "refId", column = @Column(name = "organization_ref_id"))
})
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="organization_type", discriminatorType = DiscriminatorType.STRING)
@Data
@EqualsAndHashCode(callSuper=false)
public class Organization extends BaseEntity {

    @Enumerated(EnumType.STRING)
    @Column(name = "organization_type")
    private OrgType type;

    @Column(name = "organization_name")
    private String name;

    @Column(name = "organization_slug")
    private String slug;

    @OneToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "organization_address_id", referencedColumnName = "address_id")
    private Address address;

    @Column(name = "organization_website")
    private String website;

    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(
        name="organizational_contacts",
        joinColumns={
            @JoinColumn(name="organization_id")
        },
        inverseJoinColumns= {
            @JoinColumn(name = "contact_id")
        }
    )
    private Set<Contact> keyContacts;

    @Column(name = "organization_phone")
    private String phone;

    @Column(name = "organization_domain_name")
    private String domainName;

    @Column(name = "organization_preferred_locale")
    private String preferredLocale;

}

@Entity(name = "Vendor")
@DiscriminatorValue("VENDOR")
@Data
@EqualsAndHashCode(callSuper=false)
public class Vendor extends Organization {

    @Column(name = "organization_vendor_naics_code")
    private String naicsCode;

}
当我启动我的应用程序时,我得到:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.example.myapp.domain.entities.orgs.Vendor column: organization_type (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:862)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:880)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:902)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:634)
    at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:54)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:351)
根据GoogleGods的说法,当两个类试图映射到同一列时会出现这种异常,但这正是我想要的,对吧?!我希望有两个多
Organization
子类,每个子类共享相同的
organizations
表(因此
SINGLE_table
策略),我希望
Organization\type:OrgType
enum/string作为鉴别器,告诉JPA/Hibernate我们正在处理哪个子类

有人能看出我哪里出错了吗?
  • 类型
    字段更新为
  • 您无法设置
    类型
    字段的值,hibernate将根据
    @DiscriminatorValue
    在每个子类(如
    供应商
    等)中自动填充该字段的值。但由于该字段是由hibernate设置的,因此您可以读取它

谢谢,就这样!
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.example.myapp.domain.entities.orgs.Vendor column: organization_type (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:862)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:880)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:902)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:634)
    at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:54)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:351)
    @Enumerated(EnumType.STRING)
    @Column(name = "organization_type", insertable = false, updatable = false)
    private OrgType type;