您好,我是JPA的新手,我在理解它如何处理继承时遇到了问题。
我有一个具体的问题,我需要在不改变数据库方案的情况下解决,但如果你找不到解决方案,我将感谢不同的数据库方案的解决方案建议(欢迎Hibernate/TopLink解决方案)。
如果我不清楚或者你需要更多的信息,请告诉我。提前感谢!
我有这个数据库:
TABLE Fruit
Id Varchar (10) Primary Key
size Varchar (10)
fruit_type Varchar(10)
TABLE Apple
Id Varchar (10) Primary Key Foreign Key references Fruit.Id
Apple_Property Varchar(10)到目前为止,我的实体看起来像这样:
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="fruit_type", discriminatorType=DiscriminatorType.Char)
@DiscriminatorValue(value="fruit")
public class Fruit implements Serializable {
@Id
protected String Id;
protected String size;
}
@Entity
@DiscriminatorValue(value="apple")
//@PrimaryKeyJoinColumn(name="Id" , referencedColumnName="Id")
public class Apple extends Fruit implements Serializable {
private String Apple_Property;
}目前,我可以毫无问题地持久化Fruit对象。Apple对象只有在它们的Fruit对象还没有被持久化时才会持久化。
如果我试图持久化一个apple对象和一个已经持久化的Fruit对象:
Fruit fruit1 = new Fruit("1", "Small");
Apple apple1 = new Apple(fruit1, "red");
provider.create(fruit1);
provider.create(apple1);我会得到一个错误,因为JPA试图用已经存在的Id="1“在水果表上创建一个新的行。
。。
发布于 2011-05-07 16:49:28
当使用JPA持久子对象(例如,在您的示例中为provider.create(apple1) )时,将向子表及其所有父表中插入一条记录。因此,provider.create(apple1)将在“水果”中插入一条记录,并在“苹果”表中插入一条记录。
在您的示例中,如果您只想持久化一个apple对象,只需调用provider.create(apple1)就足够了。它还将持久化apple对象中的水果引用。
顺便说一句,我建议果表的PK为number类型,并使用@GeneratedValue来标记Fruit bean的ID字段,这样你就可以让数据库为你生成一个ID,而不再需要在java代码中显式地设置它,避免因为在java代码中设置了一个已经存在的ID而导致的"ID已存在错误“。
发布于 2011-05-07 15:53:41
我认为这是完全按照设计工作。当您使用联合继承并持久化apple对象时,JPA将自动插入到apple表和水果表中。您不需要在实体类中对额外的关系或JoinColumn建模。
发布于 2011-05-07 12:24:59
在创建db表时,您正在尝试使用java继承概念,这在这种情况下是不可能的。我可以想出一种不同的方法来解决这个问题。吃fruit_type桌和水果吧。fruit_type(id,typename,desc) fruit(id,name,type_id,desc)这里的type_id是外键。
https://stackoverflow.com/questions/5919091
复制相似问题