Java JPA/Hibernate抱怨继承子类时存在重复映射
Java 8和MySQL,在使用对象继承模型进行JPA/Hibernate schedma验证时遇到一些问题。我将Hibernate设置为“验证模式”(也就是说,它应该只针对现有的DB结构验证我的Java类及其JPA/Hibernate注释) 我的Java类: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
// 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;