我对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) 值 (?,?,?,'预订',?)
答案 0 :(得分:0)
在JPA中,继承关系使用@Inheritance
注释和存储实体的策略建模。根据您当前的数据模型,我将倾向于每个类策略的表格。
基本上你会结束:
@Inheritance
注释。 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
您可能对此策略存在一种误解,即Product
类将保留在数据库中。相反,产品类中的字段应该在Book
和Shirt
表中重复。
有关每个班级的桌面教程,请参阅我的博客:http://blog-tothought.rhcloud.com/post/22