저는 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는 걱정하지 않는 것처럼 모든 고객 계정을 포함한다. '판별 자'열.
나는이 개 질문이 :
가 어떻게 listCard는 카드가 들어있는 목표 (차별 = c)를 보관할 수 및 listAccount는 계정 (판별 = A)를 포함?
고객이 먼저 쿼리하지 않고 listCard 또는 listAccount를 쿼리하는 다른 방법이 있습니까?
감사합니다. : D
accountList와 cardList는 'discriminator'열에 대해 신경 쓰지 않는 것처럼 그 고객의 Card와 Account의 모든 데이터를 포함하고 있다는 것을 무엇을 의미합니까? 'listCard'는'Card' 엔티티의리스트입니다. 당신이 말하는 것이'Account' 인스턴스를 어떻게 포함 할 수 있을지 모르겠습니다. –
Q1 : 이미 작동해야합니다. JPA의 구현/버전은 무엇을 사용합니까? 예 : 예 :이 쿼리 : 'SELECT Account a WHERE a.customer = : customer' –
검색어에 대한 매개 변수로 고객을 전달 하시겠습니까? – user2758327