2015-01-22 2 views
0

저는 JPA를 처음 사용하고 이에 대해 배우기 위해 작은 샘플을 작성했습니다. 하지만 한 가지 문제 아래에있어, 나 좀 도와주세요,하고 설명하시기 바랍니다 이유 :JPA에서 단일 테이블 상속 이해

내가 DB에 테이블 고객에 매핑되는 클래스 Customer.java을 가지고 :

@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 
} 

위의 클래스는 두 가지가 있습니다 list, accountList 및 cardList와 같은 일반 클래스 (카드 및 계정)는 단일 테이블 상속을 사용하여 BaseInfo를 확장합니다.

@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 :
여기 내 BaseInfo.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는 걱정하지 않는 것처럼 모든 고객 계정을 포함한다. '판별 자'열.

나는이 개 질문이 :

  1. 가 어떻게 listCard는 카드가 들어있는 목표 (차별 = c)를 보관할 수 및 listAccount는 계정 (판별 = A)를 포함?

  2. 고객이 먼저 쿼리하지 않고 listCard 또는 listAccount를 쿼리하는 다른 방법이 있습니까?

감사합니다. : D

+0

accountList와 cardList는 'discriminator'열에 대해 신경 쓰지 않는 것처럼 그 고객의 Card와 Account의 모든 데이터를 포함하고 있다는 것을 무엇을 의미합니까? 'listCard'는'Card' 엔티티의리스트입니다. 당신이 말하는 것이'Account' 인스턴스를 어떻게 포함 할 수 있을지 모르겠습니다. –

+0

Q1 : 이미 작동해야합니다. JPA의 구현/버전은 무엇을 사용합니까? 예 : 예 :이 쿼리 : 'SELECT Account a WHERE a.customer = : customer' –

+0

검색어에 대한 매개 변수로 고객을 전달 하시겠습니까? – user2758327

답변

0

JPA 제한 또는 최대 절전 모드 특정 제한인지 확실하지 않지만 두 개의 다른 연결을 매핑하는 데 동일한 열을 사용할 수 없습니다.

고객과 카드 간의 연결을 매핑하려면 car_customer_id을 사용해야하고 고객과 계정 간의 연결을 매핑하려면 account_customer_id을 사용해야합니다.