您的位置:首页 > 移动开发

JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-002Table per concrete class with implicit polymorphism(@MappedSuperclass、@AttributeOverride)

2016-04-07 20:49 337 查看
一、结构



二、代码

1.

package org.jpwh.model.inheritance.mappedsuperclass;

import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotNull;

@MappedSuperclass
public abstract class BillingDetails {

@NotNull
protected String owner;

// ...

protected BillingDetails() {
}

protected BillingDetails(String owner) {
this.owner = owner;
}

public String getOwner() {
return owner;
}

public void setOwner(String owner) {
this.owner = owner;
}
}


2.

package org.jpwh.model.inheritance.mappedsuperclass;

import org.jpwh.model.Constants;

import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
@AttributeOverride(
name = "owner",
column = @Column(name = "CC_OWNER", nullable = false))
public class CreditCard extends BillingDetails {

@Id
@GeneratedValue(generator = Constants.ID_GENERATOR)
protected Long id;

@NotNull
protected String cardNumber;

@NotNull
protected String expMonth;

@NotNull
protected String expYear;

// ...

public CreditCard() {
super();
}

public CreditCard(String owner, String cardNumber, String expMonth, String expYear) {
super(owner);
this.cardNumber = cardNumber;
this.expMonth = expMonth;
this.expYear = expYear;
}

public Long getId() {
return id;
}

public String getCardNumber() {
return cardNumber;
}

public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}

public String getExpMonth() {
return expMonth;
}

public void setExpMonth(String expMonth) {
this.expMonth = expMonth;
}

public String getExpYear() {
return expYear;
}

public void setExpYear(String expYear) {
this.expYear = expYear;
}

}


3.

package org.jpwh.model.inheritance.mappedsuperclass;

import org.jpwh.model.Constants;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class BankAccount extends BillingDetails {

@Id
@GeneratedValue(generator = Constants.ID_GENERATOR)
protected Long id;

@NotNull
protected String account;

@NotNull
protected String bankname;

@NotNull
protected String swift;

public BankAccount() {
super();
}

public BankAccount(String owner, String account, String bankname, String swift) {
super(owner);
this.account = account;
this.bankname = bankname;
this.swift = swift;
}

public Long getId() {
return id;
}

public String getAccount() {
return account;
}

public void setAccount(String account) {
this.account = account;
}

public String getBankname() {
return bankname;
}

public void setBankname(String bankname) {
this.bankname = bankname;
}

public String getSwift() {
return swift;
}

public void setSwift(String swift) {
this.swift = swift;
}
}


三、存在的问题

1.it doesn’t support polymorphic associations very well。You can’t have another entity mapped with a foreign key “referencing BILLINGDETAILS ”—there is no such table. This would be problematic in the domain model, because BillingDetails is associated with User ; both the CREDITCARD and BANKACCOUNT tables would need a foreign key reference to the USERS table. None of these issues can be easily resolved, so you should consider an alternative mapping strategy.

2.查父类时要查每个表。Hibernate must execute a query against the superclass as several SQL SELECT s, one for each concrete subclass. The JPA query select bd from BillingDetails bd requires two SQL statements:

select
ID, OWNER, ACCOUNT, BANKNAME, SWIFT
from
BANKACCOUNT
select
ID, CC_OWNER, CARDNUMBER, EXPMONTH, EXPYEAR
from
CREDITCARD


3.several different columns, of different tables, share exactly the same semantics.

结论:We recommend this approach (only) for the top level of your class hierarchy,where polymorphism isn’t usually required, and when modification of the superclass in the future is unlikely.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: