簡體   English   中英

Hibernate單表繼承

[英]Hibernate Single Table Inheritance

我有兩個實體BillingAddress和ShippingAddress映射到TABLE ADDRESS有鑒別器TYPE列。

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

我能夠在具有不同TYPE值的DB中成功保存/更新兩種地址類型。

我面臨的問題是當我查詢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並使用“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 {}

然后你可以寫“從地址類型= 1”與“從地址”相同,“從地址”將檢索所有行

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 {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM