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

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]

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

    点赞 评论
  • 拽拽的初行者 2010-01-22 16:57

    [quote]发现多方对应的list数据重复[/quote]

    [color=blue]啥意思,多的一方是不是有一个字段,指向“一”的一方?

    举个例子哦,不对的话,咱讨论:

    Department与Employee之间是一对多,你说的“多方”是 Department?是Department中有2个重复的Employee?如果是的话,那是Employee实体的“唯一性”约束有问题。

    [/color]

    点赞 评论
  • hekeji_liuhan 2010-01-22 18:02

    这个和你的映射写的没关系, 是Employee表的约束问题..检查下你的表属性的设置..

    点赞 评论

相关推荐 更多相似问题