我正在使用 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;
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个子类,它可以覆盖Id
或创建基于派生表的PK
键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;
}
Run Code Online (Sandbox Code Playgroud)
因此本质上CustomerA
可以包含许多产品,但它始终只能是ProductB
或ProductC
。我如何覆盖Id
子类中的 ,因为您不能使用attributeoverride
和 Entity ,并且如果使用,@Entity
则必须在@Id
指定@Entity
. 我已经阅读了 jpa wiki,它看起来相当复杂并且很难在 JPA 1.0 中实现这一点,但我想知道我是否遗漏了一些东西?
我的建议是在两个产品之间共享一个基类,以便您可以以单一方式引用它们。在 JPA/Hibernate 中,这意味着创建一个共享表,其中将包含产品的公共元素,即对 CustomerA 的引用。
实现这一点的方法是使用“JOINED”继承策略:
@Inheritance(strategy=InheritanceType.JOINED)
Run Code Online (Sandbox Code Playgroud)
使用此策略的缺点是它可能与 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;
}
Run Code Online (Sandbox Code Playgroud)
看起来你的例子已经差不多了,只需要使用正确的继承策略。
另外,这假设您没有其他扩展 AbstractProduct 基类的产品。如果您这样做并且不希望客户引用这些内容,那么您将不得不重新考虑您的域设计。
希望有帮助。
归档时间: |
|
查看次数: |
2687 次 |
最近记录: |