0

我尝试用Hibernate 5.2实现单一表继承。 基类Hibernate继承与SingleTable

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType= DiscriminatorType.STRING) 
@DiscriminatorValue("HAKSAHIBI") 
@DiscriminatorOptions(force=true) 
public class PropertyOwner implements implements Serializable{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    long id; 
    @ManyToOne 
    Property property; 
    @ManyToOne 
Person person; 

} 

作者类扩展PropertyOwner:

@Entity 
@DiscriminatorValue("AUTHOR") 
class Author extends PropertyOwner { 
} 

作曲类扩展PropertyOwner:

@Entity 
@DiscriminatorValue("COMPOSER") 
class Composer extends PropertyOwner { 
} 

Person类:

public class Person { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    long id; 
String title; 
} 

物业CLA SS

public class Property{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    long id; 
String title; 

@OneToMany 
Set<Composer> composers = new HashSet<Composer>(); 

@OneToMany 
Set<Author> authors = new HashSet<Author>(); 
} 

我期待的表结构如下:

CREATE TABLE `Property` (
    `id` bigint(20) NOT NULL, 
    `title` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `Person` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `PropertyOwner` (
    `type` varchar(31) NOT NULL, 
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `property_id` bigint(20) DEFAULT NULL, 
    `person_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK77apjkkl14xwe45rs1ocgtt4u` (`property_id`), 
    KEY `FKqagfofgupovfly26enivfhm3j` (`person_id`), 
    CONSTRAINT `FK77apjkkl14xwe45rs1ocgtt4u` FOREIGN KEY (`property_id`) REFERENCES `property` (`id`), 
    CONSTRAINT `FKqagfofgupovfly26enivfhm3j` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

但遗憾的是作者和作曲班,下面的语句

CREATE TABLE `property_propertyOwner` (
    `Property_id` bigint(20) NOT NULL, 
    `author_id` bigint(20) NOT NULL, 
    `composer_id` bigint(20) NOT NULL, 
    UNIQUE KEY `UK_rv9fxc06rcydqp6dqpqbmrkie` (`author_id`), 
    UNIQUE KEY `UK_fm4v55i021l5smuees0vs3qmy` (`composer_id`), 
    KEY `FKt3yqcltkd0et8bj08ge0sgrqb` (`Property_id`), 
    CONSTRAINT `FK1pj2606cjxrb70ps89v7609hg` FOREIGN KEY (`author_id`) REFERENCES `PropertyOwner` (`id`), 
    CONSTRAINT `FKfdh3r95jffvd07u3xn21824r7` FOREIGN KEY (`composer_id`) REFERENCES `PropertyOwner` (`id`), 
    CONSTRAINT `FKt3yqcltkd0et8bj08ge0sgrqb` FOREIGN KEY (`Property_id`) REFERENCES `Property` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

什么,我做错了创建另一个表?我期望不应该创建property_PropertyOwner表,Author,Composer类信息应该保存在propertyOwner表中。

注意:我尝试了Enumarated注解,但是这次在Property类中我无法定义Setauthor字段,我必须定义Set并将枚举信息添加到该对象。 在此先感谢。

+0

好像你在映射中缺少'mappedBy'。使用'@OneToMany(mappedBy =“property”)''和'@OneToMany(mappedBy =“person”)' –

回答

1

在您的属性实体中有多个子类(作曲家和作者)的关联没有意义。当你有单表继承时,即你的财产所有者表将拥有一个property_id的外键。 所以相反,你可以有单一的关联。

@OneToMany 
Set<PropertyOwner> composers = new HashSet<PropertyOwner>(); 

而且您可以使用DiscriminatorColumn类型将此集合拆分为作者和作曲者。

+0

由于性能问题,我想在Property和数据库中使用Author和Composer对象。如果我更改PropertyOwner,我不能使用Author作为对象。 –

+0

由于您使用单表继承,因此您将获得属性实体中的作者或作曲家对象。 Hibernate会根据discriminmator的值将它转换为适当的子类对象。 – shubham