带子类的JPA

时间:2014-03-05 10:43:21

标签: java hibernate jpa

我对JPA很新。我最近学会了如何在课程之间建立关系,但不确定在父母和孩子之间建立子类和关系时该怎么做。

这是我的问题,我想要最终结果......

我有一个抽象类Product。产品将包含所有产品共有的字段(它将具有product_id,名称,描述和价格)。 从产品扩展,我有书。书中还有一个属性是作者。 从产品延伸到衬衫。衬衫还有一个特定的属性,大小。

所以我希望数据库看起来像这样:

======

PRODUCT product_id(pk), 名称, 描述, 价

======

======

BOOK product_id(pk fk), 作者

======

======

衬衫 product_id(pk fk), 大小

==========

正如您所看到的,书和衬衫中的主键是product_id,它也是产品的外键。书与产品之间存在一对一的关系。衬衫和产品之间也是一对一的关系。

我找到了几个教程,但他们没有很好地解释它,对这个特殊问题不是很有用。

提前致谢,感谢任何帮助。

编辑:

在尝试了我在github上发现的Kevin Bowersox后,仍然坚持这个。 这是我的产品代码:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@Table(name = "EPOS_Product")
@DiscriminatorColumn(name="POST_TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Product {

@Id @GeneratedValue
@Column(name = "product_id")
protected int id;

@Column(name = "name")
protected String name;

@Column(name = "price")
protected double price;


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public double getPrice() {
    return price;
}

public void setPrice(double price) {
    this.price = price;
}

}

衬衫中的代码:

@Entity
@Table(name="EPOS_Product")
@DiscriminatorValue(value="Shirt")
public class Shirt extends Product{

@Column(name="size")
private String size;

public Shirt(){}

public Shirt(String name, double price, String size){
    this.name = name;
    this.price = price;
    this.size = size;       
}

public String getSize() {
    return size;
}

public void setSize(String size) {
    this.size = size;
}

}

Book中的代码:

@Entity
@Table(name="EPOS_Product")
@DiscriminatorValue(value="Book")
public class Book extends Product{

private String author;

public Book(){}

public Book(String name, double price, String author){
    this.name = name;
    this.price = price;
    this.author = author;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}       

}

我还尝试将书籍和衬衫中的表名改为“EPOS_Book”和“EPOS_Shirt”,但仍然出错。我明白了:

SQLGrammarException:无法执行JDBC批量更新。

BatchUpdateException:ORA-01747:user.table.column,table.column或列规范无效。

这是它尝试运行的查询:

休眠:     选择         hibernate_sequence.nextval     从         双 休眠:     选择         hibernate_sequence.nextval     从         双 休眠:     插入     成         EPOS_Product         (名称,价格,作者,POST_TYPE,product_id)     值         (?,?,?,'预订',?)

1 个答案:

答案 0 :(得分:0)

在JPA中,继承关系使用@Inheritance注释和存储实体的策略建模。根据您当前的数据模型,我将倾向于每个类策略的表格。

基本上你会结束:

  • 每个派生类的表和实体。抽象类接收自己的表。
  • 在定义了策略的抽象类上的@Inheritance注释。 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

您可能对此策略存在一种误解,即Product类将保留在数据库中。相反,产品类中的字段应该在BookShirt表中重复。

有关每个班级的桌面教程,请参阅我的博客:http://blog-tothought.rhcloud.com/post/22