2013-06-05 11 views
0

У меня есть следующее Entity классовой структурыJPA Entity Класс отношения

Класс продукта

@Entity 
@Table(name = "PRODUCTS") 
public class Product implements Serializable{ 

@Id 
private productSlNo; 
@Column(name = "PRODUCT_ID") 
private String productNo; 

ProductDetail класс

@Entity 
@Table(name = "PRODUCTDETAILS") 
public class ProductDetail extends Product implements Serializable { 

@Column(name = "PRODUCT_DESC") 
private String productDesc; 

Как я уже productNo в классе продуктов я сделал не объявлять его в классе ProductDetail.

Я хотел бы знать, как я могу получить обязательную аннотацию @Id в классе ProductDetail как уникальный ключ, определенный в классе Product. В противном случае это приведет к Объект не имеет атрибута первичного ключа, определенного. productNo является уникальным ключом для ProductDetail Entity

Как это решить? Любая помощь очень заметна.

Update 1

класс ProductDetail

@Entity 
@Table(name = "PRODUCTDETAILS") 
public class ProductDetail implements Serializable { 

@Id 
@Column(name = "PRODUCT_ID") 
private String productNo; 

@Column(name = "PRODUCT_DESC") 
private String productDesc; 

Класс продукта

@Entity 
@Table(name = "PRODUCTS") 
public class Product implements Serializable{ 

@Id 
private productSlNo; 

@Id 
@Column(name = "PRODUCT_ID") 
@OneToOne 
@MapsId  
private String productNo; 

ProductDetail productDetail; 

ответ

1

Может ли продукт существовать без ProductDetail? Первая попытка будет работать - два класса будут разделять одну и ту же таблицу продуктов, а ProductDetails - с помощью «PRODUCTDETAILS» в качестве вторичной таблицы. Это позволит вам иметь Продукты и ProductDetails, но Продукт не может быть превращен в ProductDetail. Второе обновление означает, что продукт должен иметь ProductDetail (ваша аннотация указывается на String, когда я предполагаю, что вы имели в виду, что он был включен в атрибут productDetail), поскольку определенные карты ProductDetail и в основном определяют идентификатор продукта. Если продукт может существовать без детализации, вы можете отключить эту вокруг, так что продукт имеет двунаправленную 1: 1 с ProductDetail с foriegn ключом в ProductDetail:

@Entity 
@Table(name = "PRODUCTDETAILS") 
public class ProductDetail implements Serializable { 

    @Id 
    @OneToOne 
    @JoinColumn(name="PRODUCT_ID") 
    private Product product; 

    @Column(name = "PRODUCT_DESC") 
    private String productDesc; 

и

@Entity 
@Table(name = "PRODUCTS") 
public class Product implements Serializable{ 

    @Id 
    @Column(name = "PRODUCT_ID") 
    private productSlNo; 

    @OneToOne(mappedby="product") 
    ProductDetail productDetail; 

Это приведет к тому, что ProductDetail вытащит значение «PRODUCT_ID», как определено в ссылочном продукте.

+0

Крис Продукт не может существовать, не входя в ProductDetail. В основном ProductDetail - это не что иное, как таблица поиска. благодаря – user75ponic

1

стратегия по умолчанию наследования объекта для хранения каждого поля каждого объекта в такой же таблица. Таким образом, ваше сопоставление не имеет смысла, поскольку вы указываете другую таблицу на суб-сущности.

Сначала выберите стратегию наследования, которую вы хотите использовать, а затем соответствующим образом аннотируйте свои классы. 3 стратегии наследования определены и объяснены в the documentation.

Сказанное: если целью является наличие продукта и дополнительная подробная информация об этом продукте, вы не должны использовать наследование, но вместо этого имеете ассоциацию OneToOne.

+0

Спасибо за ваш ответ.Вы хотите сказать, что мои таблицы сопоставления различны, нет смысла избегать 'productNo' в' ProductDetail' Entity? – user75ponic

+0

Это в основном справочная информация, которую я имею в таблице «PRODUCTDETAILS», где я ищу подробности данного «productNo» – user75ponic

+0

. К вашему первому вопросу, нет, это не то, что я сказал. Я сказал, что, поскольку ваша стратегия по умолчанию (по умолчанию) SINGLE_TABLE, указание таблицы для суб-сущности не имеет никакого смысла. Таким образом, вы должны выбрать стратегию наследования, которую вы желаете, и исправить отображение на основе документации. К вашему второму комментарию, поскольку вы используете наследование, вы определяете ассоциацию is-a. То, что вы хотите, - это ассоциация: у продукта есть детали. Поэтому вы не должны использовать наследование, но состав: ассоциация OneToOne. –

Смежные вопросы