JPA继承:数据库设计,其中一个表中的每一行对应于Postgres中的一个表

时间:2017-10-13 10:20:58

标签: postgresql jpa inheritance database-design

有一个名为Product(id,name)的表。 Product中的每一行都是另一种产品。每个产品都有不同的信息数据。例如:“互联网”等产品将包含“当前计划”,“帐号”,“帐户状态”等信息数据。然而,像'保险'这样的产品会有信息数据'收款人','受益人','总存款','总索赔'等等。 还有另一个名为Customer的表。

CREATE TABLE customer
(
  id serial NOT NULL,
  first_name text NOT NULL,
  last_name text NOT NULL,
  street_add text NOT NULL,
  city text NOT NULL,
  state text NOT NULL,
  zip text NOT NULL,
  phone text NOT NULL,
  ssn text,
  customer_since timestamp without time zone,
  product_id integer NOT NULL,
  intro_audio text NOT NULL,
  search_params text,
  verification_params text,
  CONSTRAINT customer_pkey PRIMARY KEY (id),
  CONSTRAINT fk_product_id FOREIGN KEY (product_id)
      REFERENCES product (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

我想为每个产品创建一个表: 例如对于互联网:

CREATE TABLE internet_product_info
(
  id serial NOT NULL,
  customer_id integer NOT NULL,
  current_plan text NOT NULL,
  acc_type text NOT NULL,
  acc_no text NOT NULL,
  CONSTRAINT internet_product_info_pkey PRIMARY KEY (id),
  CONSTRAINT fk_customer_id FOREIGN KEY (customer_id)
      REFERENCES customer(id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

保险:

CREATE TABLE insurance_product_info
(
  id serial NOT NULL,
  customer_id integer NOT NULL,
  payee text NOT NULL,
  beneficiary text NOT NULL,
  total_deposits integer NOT NULL, 
  total_claims integer NOT NULL,
  CONSTRAINT insurance_product_info_pkey PRIMARY KEY (id),
  CONSTRAINT fk_customer_id FOREIGN KEY (customer_id)
      REFERENCES customer(id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

我想问一下这种情况是否适合采用这种方案,或者有更好的选择。

在java中,我将检索产品属性,如:

public class Customer implements Serializable{  
    private int id;
    private String firstName;
    private String lastName; 
    private String streetAdd;
    private String city; 
    private String state; 
    private String zip; 
    private String phone; 
    private String ssn; 
    private Date customerSince; 
    private Object internetProdInfo;
    private Product product;    
}

if(customer.getInternetProdInfo() instanceOf InternetProdInfo){
 /* get the info for it*/
}

另外,如何动态地在jsp页面上动态加载这些产品特定字段。

1 个答案:

答案 0 :(得分:0)

您可以在Hibernate中使用java继承,如您在此处所述。 if(customer.getInternetProdInfo() instanceOf InternetProdInfo){ /* get the info for it*/ } 在这里,我们可以提供很少的链接,你可以通过它不是一个简单的解决方案,它有自己的一面,还有更多的。

  1. Documentation If You have Plenty of Time
  2. Blog Short and Helpful
  3. Another Blog Short and Helpful
  4. A Helpful Question
  5. Another Helpful Question
  6. https://stackoverflow.com
  7. Another Question

  8. Another Short Doc

    映射的超类没有为其定义单独的表(使用@MappedSuperclass)。

    可以使用@AttributeOverride@AssociationOverride注释或相应的XML元素在这些子类中覆盖

    映射信息