休眠:持久化类作为接口

时间:2019-12-05 16:32:05

标签: java hibernate spring-data-jpa

我们有一个Phone类,它使用Role s,即

@Entity
public class Phone{
  @Id...
  private Integer id;

  @Column(name="role_id")
  private IRole role;
  ...

和界面

public interface IRole extends Serializable {
    public abstract Integer getId();
    ...

因此,当我尝试将Phone保留在我的软件包中时,IRole不再是抽象的,它已经是一个具体的实体。我之所以不能直接使用具体的类,是因为我们在项目中实现了Role的不同方式。

当我尝试启动休眠模式时,出现异常:

org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [role_id
] in table [phone]; found [int4 (Types#INTEGER)], but expecting [bytea (Types#VARBINARY)]

我认为IRole引起了问题。它应该存储id中的Role-在我们所有的实现中都可用。如何告诉Hibernate应该使用Integer类型而不是某些interface插值?

正在寻找一种在PostgresMariaDB中都适用的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以为IRole接口的每个特定实现实现一个attribute converter,然后使用它们。

  @Convert(converter=RoleA.class)
  @Column(name="role_id_a")
  private IRole roleA;

  @Convert(converter=RoleB.class)
  @Column(name="role_id_b")
  private IRole roleB;