java - Hibernate JPA,重复的子结果?

标签 java spring hibernate jpa

我有一些关系如下:

@Entity
@Table(name="customer")
public class Customer
{
    @Id
    @Column(name="id")
    private int id;


    @OneToMany(fetch=FetchType.EAGER, mappedBy="customer", cascade=CascadeType.ALL)
    private List<OrderedItem> items;

    public List<OrderedItem> getItems ()
    {
        return items;
    }

    public void setItems (List<OrderedItem> _items)
    {
        items = _items;
    }
}

@Entity
@Table(name="ordereditem")
@IdClass(OrderedItemPK.class)
public class OrderedItem
{
    @Id
    @ManyToOne
    @JoinColumn(name="id_customer")
    private Customer customer;

    @Id
    @ManyToOne
    @JoinColumn(name="id_item")
    private Item item;

    public Customer getCustomer ()
    {
        return customer;
    }
    public void setCustomer (Customer _cust)
    {
        customer = _cust;
    }
    public Item getItem ()
    {
        return item;
    }
    public void setItem (Item _item)
    {
        item = _item;
    }
}

@Entity
@Table(name="item")
public class Item
{
    @Id
    @Column(name="id")
    private int id ;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name="itemcategory",
        joinColumns=
            @JoinColumn(name="id_item", referencedColumnName="id"),
        inverseJoinColumns=
            @JoinColumn(name="id_category", referencedColumnName="id")
    )
    private List<Category> categories ;



    public int getId ()
    {
        return id;
    }

    public void setId (int _id)
    {
        id = _id;
    }

    public List<Categories> getCategories ()
    {
        return categories;
    }

    public void setCategories (List<Category> _categories)
    {
        categories = _categories;
    }
}

@Entity
@Table(name="category")
public class Category
{
    @Id
    @Column(name="id")
    private int id;

    public int getId ()
    {
        return id;
    }

    public void setId (int _id)
    {
        id = _id;
    }
}

public class OrderedItemPK implements Serializable
{
    private int customer ;
    private int item ;

    public int getCustomer ()
    {
        return a;
    }
    public void setCustomer (int _cust)
    {
        customer = _cust;
    }
    public int getItem ()
    {
        return item;
    }
    public void setItem (int _item)
    {
        item = _item;
    }

    public int hashCode() {
        return customer + item;
    }

    public boolean equals(Object _o) {
        OrderedItemPK other = (OrderedItemPK) _o;
        return (customer == other.customer) && (item == other.item);
    }
}

存储库:

public interface CustomerRepo extends JpaRepository<Customer, Integer> {
}

服务:

@Service
@Transactional
public class CustomerSvc
{
    @Autowired
    CustomerRepo repo;

    public Customer findCustomer(int _id) {
        return repo.findOne(_id);
    }

    public List<Customer> findAllCustomer() {
        return repo.findAll();
    }
}

这是数据库中的内容:

customer table:

id
-----
1
2
3

ordereditem table:

id_customer     id_item
-------------------------
1                1
1                2
1                3

item table:

id
-----
1
2
3

category table:

id
----
1
2
3

itemcategory table:

id_item     id_category
-----------------------
1            1
1            2
1            3
2            1
2            2
2            3
3            1
3            2
3            3

我如何使用该服务:

Customer c = custSvc.findOne(1);

// this prints Number of ordered items: 9
System.out.println("Number of ordered items: " + c.getItems().size());

List<Customer> custs = custSvc.findAll();
c = custs.get(0);

// this prints Number of ordered items: 3
System.out.println("Number of ordered items: " + c.getItems().size());

正确的金额应该是 3,id 为 1 的客户有 3 个 OrderedItems,这 3 个 OrderedItems 每个都有 1 个 Item,每个 Item 有 3 个类别。

我想知道为什么如果我使用 Spring Data 中的 findOne 和 EntityManager 中的 find 方法,它只会给出错误的子级,而如果我使用 Spring Data 中的 findAll 或 findByAttribute 这样的方法,它会正确给出正确的子级。

最佳答案

我在 stackoverflow 中找到了类似案例的答案,但找到它并不容易,因为我需要通过大约 40 个结果才能在这里找到我正在寻找的答案。我希望其他有类似问题的人能发现这篇文章有帮助。

JPA - EntityManager find method returns duplicates

关于java - Hibernate JPA,重复的子结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49726258/

相关文章:

java - 将错误从服务层传回 View

java - Web应用程序中的内存泄漏,tomcat+hibernate+Guice

java - 多字段子集合中的 Hibernate 搜索/lucene 搜索

java - 在不同计算机上完全相同的代码的运行时错误

java - 如何删除 Ubuntu 上 Firefox/Chrome 状态栏中的 'Applet Started' 消息?

java - 在修订控制中组织我自己的外部库

使用 Hibernate 的商业 Web 应用程序中的 MySQL 许可

java - 无法让jsps在glassfish中实例化java类

spring - 如何与 HtmlUnit 共享 MockMvc session ?

java - Spring Batch 中的复制作业