【问题标题】:Difficulty creating relationship with abstract class and embedded attribute with JPA/Hibernate难以使用 JPA/Hibernate 创建与抽象类和嵌入属性的关系
【发布时间】:2018-05-08 19:25:07
【问题描述】:

我正在尝试,但到目前为止还没有成功,在 Hibernate 中使用以下类。

@MappedSuperclass
@Embeddable
    public abstract class Foo {
        //  atributes...
    }

@Embeddable
    public class Poo extends Foo {
        // atributes...
    }

@Entity  
@Table
public class None {

    // atributes...

    @Embedded
    private Foo foo;

    // constructor
    public None(Foo foo) {
        this.foo = foo;
        }
    }

 // example of save
None none = new None(Poo poo);    

save(none);

Hibernate 返回:无法实例化抽象类或接口

是否可以使用 JPA 执行此操作?

【问题讨论】:

  • 您是否尝试过从Foo 类中删除abstract 修饰符?您的代码是说None 有一个Foo,而不是Poo。如果您希望它是扩展 Foo 的东西,您可能需要阅读有关如何在 JPA 中进行继承。
  • 也许阅读this answer 会有所帮助。具体来说,您需要一个鉴别器才能使继承工作。
  • 您是否尝试从您的@MappedSuperclass Foo 抽象类中删除@Embeddable,并在您的Poo 类中使用@Embedded
  • @LuayAbdulraheem 我试过了,但没有用。继续犯同样的例外。
  • @Sometimes_Confused 不使用抽象类作品。但是我使用抽象类的想法恰恰是能够使用多态性,因为我在超类中也有抽象方法。

标签: java hibernate jpa inheritance abstract-class


【解决方案1】:

我遇到了同样的问题。

似乎@embedable 不适用于@DiscriminatorColumn。我可以让它工作的唯一方法是使用@DiscriminatorColumn,但将@embedable 视为同一张桌子上的单独实体。 这意味着查询可能会将表连接到自身。

@Entity
@Table(name="tbComputers")
public class Computer{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long id;     

    public String motherboard;    

    @OneToOne
    @JoinColumn(name="id")
    public CPU cpu;    
}

@Entity
@DiscriminatorColumn(name="cpu_type")
@Table(name="tbComputers")
public abstract class CPU {

    @Id
    private Long id;

    @Column(name = "cpu")
    public String name;

    public abstract String someProcessorSpecificMethod();

}

@Entity
@DiscriminatorValue("Intel")
public class Intel extends CPU {

    @Override
    public String someProcessorSpecificMethod() {
        return "Intel";
    }

}

@Entity
@DiscriminatorValue("AMD")
public class AMD extends CPU {

    @Override
    public String someProcessorSpecificMethod() {
        return "AMD";
    }

}

编辑:经过进一步测试,我发现虽然这适用于读取数据,但不适用于持久化。它将创建一个单独的 INSERT。似乎不支持https://hibernate.atlassian.net/browse/HHH-1910。另一种方法是拆分表。

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 2011-04-19
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2023-03-15
    相关资源
    最近更新 更多