miércoles, 4 de julio de 2007

Herencia en clases persistentes- ejemplo DVD store

La herencia en este caso se implementa con un campo en la base de datos que hace de discriminador @DiscriminatorValue, de esta forma las dos entidades hijas se encuentran en la misma tabla de la base datos.
Atención lapropiedad que hace de discriminator value no se declara en el código java, solo a nivel de anotación de clase

Clase padre: User

@Entity
@Table(name="USERS")
public abstract class User
implements Serializable
{
long id;

String userName;
String password;

String firstName;
String lastName;

@Id @GeneratedValue
@Column(name="USERID")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}

@Column(name="USERNAME",unique=true,nullable=false,length=50)
@NotNull
@Length(min=4,max=16)
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}

@Column(name="PASSWORD",nullable=false,length=50)
@NotNull
@Length(min=6,max=50)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

@Column(name="FIRSTNAME",length=50)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name="LASTNAME",length=50)
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}

@Transient
public boolean isAdmin() {
return false;
}
}


Clase hija: Admin
@Entity
@DiscriminatorValue("admin")
public class Admin
extends User
implements Serializable
{
@Transient
public boolean isAdmin() {
return true;
}

}



Clase hija: Customer
@Entity
@Name("customer")
@DiscriminatorValue("customer")
public class Customer
extends User
implements Serializable
{
public static String[] cctypes = {"MasterCard", "Visa", "Discover", "Amex", "Dell Preferred"};

String address1;
String address2;
String city;
String state;
String zip;

String email;
String phone;

Integer creditCardType = 1;
String creditCard = "000-0000-0000";
int ccMonth = 1;
int ccYear = 2005;


public Customer() {
}


@Column(name="ADDRESS1",length=50)
@NotNull
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}

@Column(name="ADDRESS2",length=50)
@NotNull
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}

@Column(name="CITY",length=50)
@NotNull
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}


@Column(name="STATE",length=2)
@NotNull
@Length(min=2,max=2)
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}

@Column(name="ZIP", length=10)
@Length(min=5, max=10)
@Pattern(regex="[0-9]{5}(-[0-9]{4})?", message="not a valid zipcode") // {validator.zip}
@NotNull
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}

@Column(name="EMAIL",length=50)
@Email
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}

@Column(name="PHONE",length=50)
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}


@Column(name="CREDITCARDTYPE")
public Integer getCreditCardType() {
return creditCardType;
}
public void setCreditCardType(Integer type) {
this.creditCardType = type;
}

@Transient public String getCreditCardTypeString() {
if (creditCardType<1>cctypes.length) {
return "";
}
return cctypes[creditCardType-1];
}

@Column(name="CC_NUM", length=50)
public String getCreditCard() {
return creditCard;
}
public void setCreditCard(String creditCard) {
this.creditCard = creditCard;
}

@Column(name="CC_MONTH", length=50)
public int getCreditCardMonth() {
return ccMonth;
}
public void setCreditCardMonth(int ccMonth) {
this.ccMonth = ccMonth;
}

@Column(name="CC_YEAR", length=50)
public int getCreditCardYear() {
return ccYear;
}
public void setCreditCardYear(int ccYear) {
this.ccYear = ccYear;
}

@Transient
public String getCreditCardExpiration() {
return "" + ccMonth + "/" + ccYear;
}

@Override
public String toString() {
return "Customer#" + getId() + "(" + userName + ")";
}

}

No hay comentarios: