Hibernate single table inheritance

I have two BillingAddress and ShippingAddress objects mapped to TABLE ADDRESS with a TYPE column of discriminator.

@Entity
@Table(name = "address")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE",discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue(value = "1")
@NamedQueries({
    @NamedQuery(name = "Shippingaddress.findAll", query = "SELECT s FROM Shippingaddress s")})
public class Shippingaddress  implements Serializable{}

@Entity
@Table(name = "address")
@DiscriminatorValue(value = "2")
@NamedQueries({
    @NamedQuery(name = "Billingaddress.findAll", query = "SELECT b FROM Billingaddress b")})
public class Billingaddress extends Shippingaddress implements Serializable {}

I can save / update two types of addresses successfully in a database with different TYPE values.

The problem I am facing is when I query the ADDRESS table as follows:

Session session=getCurrentSession();
        Query query=session.createQuery("from Billingaddress where userId.userId=:userId");
        query.setLong("userId", userId);
        billingaddress=(Billingaddress)query.uniqueResult();

This works fine, but the ShippingAddress request throws a NonUniqueResult exception, i.e. I get both ShippingAddress and Billingaddress as a result. Please let me know what to do differently.

Session session=getCurrentSession();
        Query query=session.createQuery("from Shippingaddress where userId.userId=:userId");
        query.setLong("userId", userId);
        shippingaddress=(Shippingaddress)query.uniqueResult();
+4
source share
2 answers

- "insertable = false, updatable = false"

:

@Entity
@Table(name = "address")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE",discriminatorType = DiscriminatorType.INTEGER)
@NamedQueries({
@NamedQuery(name = "Address.findAll", query = "SELECT s FROM Address s where type = :type")})
public class Address implements Serializable {
    @Column(name="TYPE", insertable=false, updatable=false)
    private Integer type;
}

@Entity
@DiscriminatorValue(value = "1")
@NamedQueries({
@NamedQuery(name = "Shippingaddress.findAll", query = "SELECT s FROM Shippingaddress s")})
public class Shippingaddress  implements Serializable{}

@Entity
@DiscriminatorValue(value = "2")
@NamedQueries({
@NamedQuery(name = "Billingaddress.findAll", query = "SELECT b FROM Billingaddress b")})
public class Billingaddress extends Shippingaddress implements Serializable {}

"from Address, type = 1" "from Shippingaddress" "from Address"

+2

DiscriminatorColumn DiscriminatorValue ... , ...

ShippingaddressAbstract.java

@Table(name = "address")
@Inheritance
@DiscriminatorColumn(name = "TYPE",discriminatorType = DiscriminatorType.INTEGER)
public abstract class ShippingaddressAbstract implements java.io.Serializable {

}

Shippingaddress.java

@Entity
@DiscriminatorValue(value = "1")
public class Shippingaddress extends ShippingaddressAbstract {

}

Billingaddress.java

@Entity
@DiscriminatorValue(value = "2")
public class Billingaddress  extends ShippingaddressAbstract {

}
+1

All Articles