package cyrille.hibernate;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import junit.framework.TestCase;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.DiscriminatorFormula;
import org.hibernate.cfg.AnnotationConfiguration;
import com.thoughtworks.xstream.annotations.XStreamAlias;
public class HibernateInheritanceTest extends TestCase {
@Entity
@DiscriminatorValue(value = "boy-boy")
public static class Boy extends Person {
private static final long serialVersionUID = 1L;
public Boy() {
super();
}
public Boy(String name) {
super(name, "boy", "boy");
}
}
@Entity
@DiscriminatorValue(value = "girl-girl")
public static class Girl extends Person {
public Girl() {
super();
}
public Girl(String name) {
super(name, "girl", "girl");
}
private static final long serialVersionUID = 1L;
}
@Entity()
@Table(name = "person")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula(value = "discriminator1 || '-' || discriminator2")
public abstract static class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Basic
@Column(name = "discriminator1", nullable = false, length = 255)
String discriminator1;
@Basic
@Column(name = "discriminator2", nullable = false, length = 255)
String discriminator2;
@Id
@GeneratedValue
Long id;
@Basic
@Column(name = "name", nullable = false, length = 255)
@XStreamAlias("name")
String name;
public Person() {
super();
}
public Person(String name, String discriminator1, String discriminator2) {
super();
this.name = name;
this.discriminator1 = discriminator1;
this.discriminator2 = discriminator2;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
return new EqualsBuilder().append(this.id, other.id).isEquals();
}
public String getDiscriminator1() {
return this.discriminator1;
}
public String getDiscriminator2() {
return this.discriminator2;
}
public Long getId() {
return this.id;
}
public String getName() {
return this.name;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(this.id).toHashCode();
}
public void setDiscriminator1(String discriminator1) {
this.discriminator1 = discriminator1;
}
public void setDiscriminator2(String discriminator2) {
this.discriminator2 = discriminator2;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String firstName) {
this.name = firstName;
}
@Override
public String toString() {
return new ToStringBuilder(this).append("id", this.id).append("firstName", this.name).toString();
}
}
SessionFactory sessionFactory;
@Override
protected void setUp() throws Exception {
super.setUp();
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.configure();
configuration.addAnnotatedClass(Person.class).addAnnotatedClass(Boy.class).addAnnotatedClass(Girl.class);
configuration.buildMappings();
this.sessionFactory = configuration.buildSessionFactory();
}
public void test() throws Exception {
Long tomId;
Long britneyId;
{
// INITIALIZE
this.sessionFactory.getCurrentSession().getTransaction().begin();
Boy tom = new Boy("tom");
Girl britney = new Girl("britney");
this.sessionFactory.getCurrentSession().save(tom);
this.sessionFactory.getCurrentSession().save(britney);
this.sessionFactory.getCurrentSession().getTransaction().commit();
tomId = tom.getId();
britneyId = britney.getId();
}
{
// LOAD
this.sessionFactory.getCurrentSession().getTransaction().begin();
Boy tom = (Boy) this.sessionFactory.getCurrentSession().get(Person.class, tomId);
Girl britney = (Girl) this.sessionFactory.getCurrentSession().get(Person.class, britneyId);
assertEquals("tom", tom.getName(), "tom");
assertEquals("britney", britney.getName(), "britney");
this.sessionFactory.getCurrentSession().getTransaction().commit();
}
}
}