Hibernate单表继承 [英] Hibernate Single Table Inheritance

查看:106
本文介绍了Hibernate单表继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器TYPE列的TABLE ADDRESS。

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

我可以保存/更新这两个地址类型成功地在数据库中使用不同的TYPE值。

我遇到的问题是当我查询ADDRESS表时,如下所示:

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

这工作正常,但是查询ShippingAddress会抛出NonUniqueResult异常,即我得到Shippingaddress和Billingaddress。请让我知道,我该怎么做不同。

  Session session = getCurrentSession(); 
Query query = session.createQuery(from Shippingaddress where userId.userId =:userId);
query.setLong(userId,userId);
shippingaddress =(Shippingaddress)query.uniqueResult();


解决方案

另一个解决方案是创建一个抽象类Address和map父类中具有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 {}
$ b @Entity
@DiscriminatorValue(value =2)
@NamedQueries({
@NamedQuery(name =Billingaddress.findAll,query =SELECT b FROM Billingaddress b)})
public class Billingaddress extends Shippingaddress implements Serializable {}

然后您可以写入from Address where type = 1与from Shippingaddress和from Address相同检索所有行


I have two Entities BillingAddress and ShippingAddress mapped to TABLE ADDRESS having discriminator TYPE column.

@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 am able to save/update the two address type successfully in DB with different TYPE values.

The problem I am facing is when I am querying 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 querying ShippingAddress throws NonUniqueResult Exception ie I get both Shippingaddress and Billingaddress in result. Please let me know , what should I do differently.

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

解决方案

another solution is to create an abstract class Address and map the column in the parent class with "insertable = false, updatable = false"

Then you can add the type in your query:

@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 {}

then you can write "from Address where type = 1" is the same as "from Shippingaddress" and "from Address" will retrieve all rows

这篇关于Hibernate单表继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆