【问题标题】:Hibernate: Persist class as InterfaceHibernate:将类持久化为接口
【发布时间】:2020-03-30 15:26:46
【问题描述】:

我们有一个类Phone,它使用Roles,即。

@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

当我尝试启动 Hibernate 时出现异常:

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 会导致问题。它应该存储Roleid - 这在我们所有的实现中都可用。如何告诉 Hibernate 它应该使用类型 Integer 而不是一些 interface 插值?

寻找一种适用于Postgres 以及MariaDB 的解决方案。

【问题讨论】:

  • Phone 类中将 roleIRole 更改为 Integer,然后修复引用。
  • 是的,但我想保持对象的完整性,而不是开始处理我自己的对象。
  • 也许这会有所帮助:stackoverflow.com/questions/3827494/…。它用于抽象类而不是接口

标签: java hibernate spring-data-jpa


【解决方案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;

【讨论】:

  • 是的,我认为这可能是一种有效的方法。我会检查一下。谢谢提示。
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2012-02-16
相关资源
最近更新 更多