使用Hibernate获取重复条目

用户1472409

使用JPA /休眠时,我遇到一个奇怪的问题。我在测试期间看到重复的条目。

这是我的BaseEntity类:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
    
    @Id
    @Column(name = "ID", updatable = false, nullable = false)
    @GenericGenerator(name = "uniqueIDGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
            @org.hibernate.annotations.Parameter(name = "sequence_name", value = "ID_SEQUENCE"),
            @org.hibernate.annotations.Parameter(name = "increment_size", value = "100"),
            @org.hibernate.annotations.Parameter(name = "optimizer ", value = "pooled") })
    @GeneratedValue(generator = "uniqueIDGenerator")
    @NotNull
    protected int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    
}

这是我的主要伴侣课程:

@Entity
@Table(name = "partner")
public class Partner extends BaseEntity{
    
    @Column(name = "name")
    private String name;
    
    @OneToMany(mappedBy="partner", fetch=FetchType.EAGER)
    @Cascade(CascadeType.DELETE)
    private List<Receipt> receipts;
    
    @OneToMany(mappedBy="partner", fetch=FetchType.EAGER)
    @Cascade(CascadeType.DELETE)
    private List<Delivery> deliveries;
    
    public Partner() {
        setReceipts(new ArrayList<Receipt>());
        setDeliveries(new ArrayList<Delivery>());
    }
    
    public Partner(String name){
        this();
        
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Receipt> getReceipts() {
        return receipts;
    }

    public void setReceipts(List<Receipt> receipts) {
        this.receipts = receipts;
    }

    public List<Delivery> getDeliveries() {
        return deliveries;
    }

    public void setDeliveries(List<Delivery> deliveries) {
        this.deliveries = deliveries;
    }
}

合作伙伴有两个子类,即收货和交货。这是收据类:

@Entity
@Table(name = "receipt")
public class Receipt extends BaseEntity{
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="partnerId")
    private Partner partner;
    
    @Column(name = "name")
    private String name;
    @Column(name = "json")
    private String json;

    @Transient
    private ReceiptContainer receiptContainer;
    
    
    public Receipt() {
    }
    public Receipt(String name){
        this();
        
        this.setName(name);
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJson() {
        return json;
    }

    public void setJson(String json) {
        this.json = json;
    }

    public ReceiptContainer getReceiptContainer() {
        return receiptContainer;
    }

    public void setReceiptContainer(ReceiptContainer receiptContainer) {
        this.receiptContainer = receiptContainer;
    }

    public Partner getPartner() {
        return partner;
    }

    public void setPartner(Partner partner) {
        this.partner = partner;
    }
    
}

这是交付类:

@Entity
@Table(name = "delivery")
public class Delivery extends BaseEntity{
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="partnerId")
    private Partner partner;
    
    @Column(name = "name")
    private String name;
    @Column(name = "json")
    private String json;

    @Transient
    private DeliveryContainer deliveryContainer;
    
    
    public Delivery() {
    }
    public Delivery(String name){
        this();
        
        this.setName(name);
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJson() {
        return json;
    }

    public void setJson(String json) {
        this.json = json;
    }

    public DeliveryContainer getDeliveryContainer() {
        return deliveryContainer;
    }

    public void setDeliveryContainer(DeliveryContainer deliveryContainer) {
        this.deliveryContainer = deliveryContainer;
    }

    public Partner getPartner() {
        return partner;
    }

    public void setPartner(Partner partner) {
        this.partner = partner;
    }
    
}

我正在得到这样的对象:

@Transactional
public Partner get(int id){
    Partner partner = entityManager.find(Partner.class, id);
    return partner;
}

如您所见,伙伴类包括一个对象列表和一个对象列表,它们分别存储在各自的表中,分别是收货和交货。

---在继续之前,我想指出数据库中显示了正确的条目数。仅在我的Java应用程序中获取对象时才会发生此问题。

当我添加一个对象并且不存在任何对象时,将显示一个对象,并且不显示任何对象,这是预期的。如果存在一个对象和一个对象,则会再次显示一个对象和一个对象。当存在多个对象时,就会出现此问题。例如,如果添加了两个对象,但仅添加了一个对象,则将显示两个对象和两个对象。

为了更好地说明这一点,请参见下面的测试用例表。意外的结果用短划线包围。

<Receipt> Obj Added | <Delivery> Obj Added | <Receipt> Obj Displayed | <Delivery> Obj Displayed
         0          |          0           |           0             |            0
         0          |          1           |           0             |            1
         1          |          0           |           1             |            0
         1          |          1           |           1             |            1
         1          |          2           |        ---2---          |         ---2---
         2          |          1           |        ---2---          |         ---2---
         2          |          2           |        ---4---          |         ---4---

我的问题是,为什么我会看到这些意外的结果?

zmf

您看到重复项的原因是因为您渴望获取子项,从而创建了外部联接。

(您可以使用@Fetch(FetchMode.SELECT),但这将导致其他查询来检索您的项目)

指示发生外部联接的Hibernate API参考。

这是对您的问题的深入解答:Hibernate Criteria使用FetchType.EAGER多次返回子级。

您可以从列表切换到集合(如果这样做,请确保覆盖equals / compareTo / hashCode)。或者,如果您要通过条件从数据库中提取这些项目,则可以将结果转换器添加到查询结果中。

对于它的价值,hibernate建议在列表上使用集合

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Hibernate OneToMany MySQLIntegrityConstraintViolationException:重复的条目

来自分类Dev

获取最多重复的条目

来自分类Dev

Hibernate 重复的数据库条目

来自分类Dev

获取字典中接口的重复条目

来自分类Dev

从mysql获取数据并替换重复条目

来自分类Dev

如何避免重复输入并使用NHibernate获取对应的原始条目的ID

来自分类Dev

使用Querydsl获取@ElementCollection条目

来自分类Dev

使用PHP获取偶数条目

来自分类Dev

使用mongoose从mongodb获取条目

来自分类Dev

使用jar更新清单并覆盖重复的条目

来自分类Dev

使用angular.js控制重复条目

来自分类Dev

使用bash,awk或sed删除重复的条目

来自分类Dev

使用 PDO 创建的数组中的重复条目

来自分类Dev

Hibernate 使用 ManyToOne 注释保存新条目

来自分类Dev

从数组中获取重复的条目(而不是仅仅删除它们)

来自分类Dev

从数组中获取重复的条目(而不是仅仅删除它们)

来自分类Dev

从设备获取数据并将其保存到sql重复条目

来自分类Dev

使用Grep获取特定条目并忽略其他条目

来自分类Dev

使用ant获取清单文件的条目

来自分类Dev

使用COBOL从.dat文件获取特定条目

来自分类Dev

使用PHP获取数组中的匹配条目

来自分类Dev

获取单个条目并使用MySQLi显示它?

来自分类Dev

如何从ID为重复的数据库mysql获取重复条目

来自分类Dev

如何从ID为重复的数据库mysql获取重复条目

来自分类Dev

使用HashSet获取重复的元素

来自分类Dev

使用MySQL或PHP防止重复条目的正确方法

来自分类Dev

使用一些重复的条目更新MySQL表

来自分类Dev

使用准备好的SQL语句捕获重复条目

来自分类Dev

使用Plotly仪表板时,烧瓶日志条目重复

Related 相关文章

热门标签

归档