nibacool 2010-01-22 16:39
浏览 1220
已采纳

JPA(hibernate)中 一对多关系 查询数据重复问题

在用jpa的时候,发现一个问题:在实现一对多关系

配置如下:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "expenseRequisition")
发现多方对应的list数据重复,
不知道各位有没有遇见过同样的问题。

  • 写回答

3条回答

  • easinchu 2010-01-24 15:48
    关注

    我估计是你的映射文件或者是表结构的设计出了问题,在这我提供一个参考实例,希望对你有所帮助:

    [b]多对多:订单<-->商品[/b]

    [b]数据库表结构:[/b]
    [code="java"]
    CREATE TABLE PRODUCT(
    PRODUCT_ID VARCHAR(36) NOT NULL PRIMARY KEY,
    PRODUCT_CODE VARCHAR(32) NOT NULL UNIQUE,
    PRODUCT_NAME VARCHAR(32) NOT NULL,
    PRODUCT_PRICE DECIMAL(10,2) DEFAULT NULL
    )ENGINE=INNODB DEFAULT CHARSET=UTF8;

    CREATE TABLE ORDERS(
    ORDER_ID VARCHAR(36) NOT NULL PRIMARY KEY,
    TOTAL_PRICE DECIMAL(10,2) NOT NULL
    )ENGINE=INNODB DEFAULT CHARSET=UTF8;

    CREATE TABLE ORDERS_PRODUCT(
    ORDER_ID VARCHAR(36) NOT NULL,
    PRODUCT_ID VARCHAR(36) NOT NULL,
    PRIMARY KEY(ORDER_ID,PRODUCT_ID)
    )ENGINE=INNODB DEFAULT CHARSET=UTF8;

    INSERT INTO PRODUCT(PRODUCT_ID,PRODUCT_CODE,PRODUCT_NAME,PRODUCT_PRICE) VALUES('1','mp3','MP3随身听',100);
    INSERT INTO PRODUCT(PRODUCT_ID,PRODUCT_CODE,PRODUCT_NAME,PRODUCT_PRICE) VALUES('2','mp4','MP4随身看',1000);

    INSERT INTO ORDERS(ORDER_ID,TOTAL_PRICE) VALUES('1',1100);
    INSERT INTO ORDERS(ORDER_ID,TOTAL_PRICE) VALUES('2',1100);

    INSERT INTO ORDERS_PRODUCT(ORDER_ID,PRODUCT_ID) VALUES('1','1');
    INSERT INTO ORDERS_PRODUCT(ORDER_ID,PRODUCT_ID) VALUES('1','2');
    INSERT INTO ORDERS_PRODUCT(ORDER_ID,PRODUCT_ID) VALUES('2','1');
    INSERT INTO ORDERS_PRODUCT(ORDER_ID,PRODUCT_ID) VALUES('2','2');
    [/code]

    [b]XML实体映射文件:[/b]
    [code="java"]















    <!-- 由Order对象维护关联关系,Order为主控方 -->






    <class name="cn.com.sise.relate.manyToMany.Order" table="ORDERS">
        <id name="orderId" type="string">
            <column name="ORDER_ID" length="36"/>
            <generator class="guid"/>
        </id>
        <property name="totalPrice">
            <column name="TOTAL_PRICE" precision="10" scale="2"/>
        </property>
        <set name="products" table="ORDERS_PRODUCT" cascade="save-update" inverse="true" fetch="join">
            <key column="ORDER_ID"/>
            <many-to-many class="cn.com.sise.relate.manyToMany.Product">
                <column name="PRODUCT_ID"/>
            </many-to-many>
        </set>
    </class>
    


    [/code]

    [b]实体Java文件:[/b]
    [code="java"]
    import java.util.HashSet;
    import java.util.Set;

    public class Order {

    private String orderId;
    
    private Float totalPrice;
    
    private Set<Product> products = new HashSet<Product>();
    
    public String getOrderId() {
        return orderId;
    }
    
    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }
    
    public Float getTotalPrice() {
        return totalPrice;
    }
    
    public void setTotalPrice(Float totalPrice) {
        this.totalPrice = totalPrice;
    }
    
    public Set<Product> getProducts() {
        return products;
    }
    
    public void setProducts(Set<Product> products) {
        this.products = products;
    }
    

    }
    [/code]

    [code="java"]
    import java.util.HashSet;
    import java.util.Set;

    public class Product {

    private String productId;
    
    private String productCode;
    
    private String productName;
    
    private Float productPrice;
    
    private Set<Order> orders = new HashSet<Order>();
    
    public String getProductId() {
        return productId;
    }
    
    public void setProductId(String productId) {
        this.productId = productId;
    }
    
    public String getProductCode() {
        return productCode;
    }
    
    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }
    
    public String getProductName() {
        return productName;
    }
    
    public void setProductName(String productName) {
        this.productName = productName;
    }
    
    public Float getProductPrice() {
        return productPrice;
    }
    
    public void setProductPrice(Float productPrice) {
        this.productPrice = productPrice;
    }
    
    public Set<Order> getOrders() {
        return orders;
    }
    
    public void setOrders(Set<Order> orders) {
        this.orders = orders;
    }
    

    }
    [/code]

    你可以对照下你的映射设置是否有问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘