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

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

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

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

[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]

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

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

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

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

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

[/color]

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