我正在使用JPA 1.0,因此我可以做的事情受到限制,但我仍然认为应该可以执行以下操作,但是我无法让它工作......
Table CustomerA
a_id
Table ProductB
a_id
b_id
Table ProductC
a_id
c_id
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractProduct {
@Id
@GeneratedValue....
private Long id;
private String name;
@ManyToOne()
JoinColumn(name="a_id")
private CustomerA customerA;
}
现在我想创建一个可以覆盖Id
的子类,或者根据PK
的{{1}}和派生表的键创建一个复合键... < / p>
Table A
基本上@Entity
@Table(name="ProductB")
public class ProductB extends AbstractProduct {
//@AttributeOverride(name="id", column=@Column(name="B_ID") //Can only be used with MappedSuperClass and also Emmbedded Objects
//@Id //cant override the ID Column so that cant go here
//PrimaryKeycolumn join not what i want here
private Long productB_id;
private String productName;
}
@Entity
@Table(name="CustomerA")
public class CustomerA
{
@Id
@GeneratedValue....
@Column(name="a_id")
private Long aId
@OneToMany(mappedBy="customerA", cascade=CascadeType.ALL)
private Set<AbstractProduct> product;
}
可以包含许多产品,但它始终只有CustomerA
或ProductB
。如果您无法使用ProductC
和实体,我如何覆盖子类中的Id
?如果您使用attributeoverride
,则必须在指定@Entity
时指定@Id
}。我已经阅读了jpa wiki并且它看起来相当复杂并且在JPA 1.0中实现了这一点,但是我想知道我是否遗漏了什么?
答案 0 :(得分:0)
我的建议是在两种产品之间共享基类,以便您可以以单一方式引用它们。在JPA / Hibernate中,这意味着创建一个包含Product的公共元素的共享表,即对CustomerA的引用。
您可以通过'JOINED'继承策略来实现这一目标:
@Inheritance(strategy=InheritanceType.JOINED)
使用此策略的缺点是它可能与您在AbstractProduct基类中已经使用的现有“TABLE_PER_CLASS”状态发生冲突....尽管这可能是适用于此的基类。从我记忆中,你不能混合继承策略。
以下是一个例子:
@Entity
@Table(name="CustomerA")
public class CustomerA
{
@Id
@GeneratedValue....
@Column(name="a_id")
private Long aId
@OneToMany(mappedBy="customerA", cascade=CascadeType.ALL)
private Set<AbstractProduct> product;
}
@Entity
@Table(name="ProductB")
public class ProductB extends AbstractProduct {
private String specificProductBValue;
}
@Entity
@Table(name="ProductC")
public class ProductC extends AbstractProduct {
private String specificProductCValue;
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class AbstractProduct {
@Id
@GeneratedValue....
private Long id;
private String name;
@ManyToOne()
JoinColumn(name="customer_id")
private CustomerA customerA;
}
看起来你几乎就是你的例子,只需要使用正确的继承策略。
此外,这假设您没有其他产品来扩展您的AbstractProduct基类。如果您这样做而且您不想要客户引用的那些,那么您将不得不重新考虑您的域设计。
希望有所帮助。