繁体   English   中英

了解JPA中的单表继承

[英]Understanding Single Table Inheritance in JPA

我是JPA的新手,并且做了一个小样本来了解它。 但是我在下面遇到一个问题,请帮帮我,并解释原因:

我有类Customer.java,它映射到db中的表customer:

@Entity
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id_customer")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    // accountNumber field maps with accountNumber column in Account table
    @Column(name = "loginId", unique = true)
    private String loginId;

    @Column(name = "password")
    private String password;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @Column(name = "address")
    private String address;

    @Column(name = "email")
    private String email;

    @Column(name = "phone")
    private String phone;

    @OneToMany(mappedBy="customer")
    private List<Account> accountList;

    @OneToMany(mappedBy="customer")
    private List<Card> cardList;
// getters and setters goes here
}

上面的类有两个列表accountList和cardList,它们的通用类(Card和Account)使用Single table Inheritance扩展BaseInfo。
这是我的BaseInfo.java:

@Entity
@Table(name = "account")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
public class BaseInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "number")
    private String number;

    @Column(name = "availableNumber")
    private Long availableNumber;
//getter and setter here
}

Card.java类:

@Entity
@Table(name = "account")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(value = "C")
public class Card extends BaseInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "cardType")
    private String cardType;

    @ManyToOne
    @JoinColumn(name = "id_customer")
    private Customer customer;

//getter and setter
}

和类Account.java:

@Entity
@Table(name = "account")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(value = "A")
public class Account extends BaseInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name = "accountName")
    private String accountName;

    @Column(name = "accountType")
    private String accountType;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_created")
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_lst_updt")
    private Date lastUpdatedDate;

    @ManyToOne
    @JoinColumn(name = "id_customer")
    private Customer customer;

//getter, setter
}

然后,我执行一个查询,使用loginid和密码从数据库查询客户,如下所示:

entityTransaction.begin();

TypedQuery<Customer> query = entityManager.createQuery(
                    "SELECT c FROM " + Customer.class.getName()
                            + " c Where c.loginId= :loginId", Customer.class);
query.setParameter("loginId", loginId);

res = query.getSingleResult();

entityTransaction.commit();

代码运行没有错误,但是结果令我有些奇怪:当我调试(或将结果打印到jsp)时,accountList或cardList包含该客户的所有Account,就像他们不关心'discriminator' '列。

我有两个问题:

  1. 如何归档listCard仅包含Card(区分= c)和listAccount仅包含Account(discriminator = a)的目标?

  2. 有没有另外一种查询listCard或listAccount的方法,而无需先查询客户(例如我使用的)?

预先感谢! :D

我不确定这是JPA限制还是特定于Hibernate的限制,但您可能无法使用同一列来映射两个不同的关联。

您应该使用诸如car_customer_id类的car_customer_id来映射客户与卡之间的关联,并使用account_customer_id来映射客户与帐户之间的关联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM