2015-05-04 40 views
0

插入/更新與另一個實體具有多對多關係的實體。我有兩個表產品類別
產品表如問題所述,使用java標準api

... 
create table products (
    id int primary key generated always as identity(start with 100, increment by 1), 
    name varchar(30), 
    quantity int, 
    unit_cost decimal not null, 
    brand_name varchar(30) 
) 
... 

分類表

... 
create table categories 
(
    name varchar(30) primary key, 
    description varchar(30), 
    date_created date, 
) 

... 他們的關係是多對多的關係,所以我創建了一個關係表。

關係表

... 
create table product_categories 
(
    product_id int not null, 
    category_name varchar(30) not null 
) 
alter table product_categories add constraint product_categoriesFK foreign key (product_id) 
references products (id) 
alter table product_categories add constraint category_productsFK foreign key (category_name) 
references categories (name) 

這些是有各自的實體類。

產品實體

@Entity 
@Table(name = "PRODUCTS") 
public class Product implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "ID") 
    private Integer id; 
    @Size(max = 255) 
    @Column(name = "NAME") 
    private String name; 
    @Column(name = "QUANTITY") 
    private Integer quantity; 
    @Column(name = "UNIT_COST") 
    private Integer unitCost; 
    @JoinTable(name = "REQUISITION_PRODUCTS", joinColumns = { 
      @JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID")}, inverseJoinColumns = { 
    @JoinColumn(name = "REQUISITION_ID", referencedColumnName = "ID")}) 
    @ManyToMany 
    private Collection<Requisition> requisitionCollection; 
    @ManyToMany(mappedBy = "productCollection", cascade = CascadeType.ALL) 
    private Collection<Category> categoryCollection; 
    @JoinColumn(name = "BRAND_NAME", referencedColumnName = "NAME") 
    @ManyToOne 
    private Brand brand; 
    @JoinColumn(name = "DEAL_ID", referencedColumnName = "ID") 
    @ManyToOne 
    private Deal dealId; 
    @OneToMany(mappedBy = "product") 
    private Collection<Feature> featureCollection; 
    ... 

類別實體使用NetBeans IDE生成

@Entity 
@Table(name = "CATEGORIES") 
public class Category implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 255) 
    @Column(name = "NAME") 
    private String name; 
    @Column(name = "DATE_CREATED") 
    @Temporal(TemporalType.DATE) 
    private LocalDate dateCreated; 
    @Size(max = 255) 
    @Column(name = "DESCRIPTION") 
    private String description; 
    @JoinTable(name = "PRODUCT_CATEGORIES", joinColumns = { 
    @JoinColumn(name = "CATEGORY_NAME", referencedColumnName = "NAME")}, inverseJoinColumns = { 
    @JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID")}) 
    @ManyToMany 
    private Collection<Product> productCollection; 
    ... 

這些實體類。關係一個表的實體沒有被創建,所以我不知道如何插入/更新類別 a 產品屬於。
這是我執行插入/更新的代碼。

@Override 
public int update(Object value, Product t) { 
    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
    CriteriaUpdate<Product> cu = cb.createCriteriaUpdate(Product.class); 

    cu.set(Product_.brand, t.getBrand()); 
    cu.set(Product_.id, t.getId()); 
    cu.set(Product_.name, t.getName()); 
    cu.set(Product_.quantity, t.getQuantity()); 
    cu.set(Product_.unitCost, t.getUnitCost()); 

    // cu.set(Product_.categoryCollection, t.getCategoryCollection()); 

    Root<Product> root = cu.getRoot(); 
    Predicate tester = cb.equal(root.get(Product_.id), value); 
    cu.where(tester); 

    Query q = getEntityManager().createQuery(cu); 
    return q.executeUpdate(); 
} 

產品元模型類

... 
public class Product_ { 
    public static volatile SingularAttribute<Product, Integer> quantity; 
    public static volatile CollectionAttribute<Product, Requisition> requisitionCollection; 
    public static volatile CollectionAttribute<Product, Category> categoryCollection; 
    public static volatile SingularAttribute<Product, Deal> dealId; 
    public static volatile SingularAttribute<Product, Integer> unitCost; 
    public static volatile SingularAttribute<Product, String> name; 
    public static volatile CollectionAttribute<Product, Feature> featureCollection; 
    public static volatile SingularAttribute<Product, Integer> id; 
    public static volatile SingularAttribute<Product, Brand> brand; 
    ... 

從我所看到的,元類期望一個類別,而不是一個類的集合。請有人告訴我如何解決這個問題。
軟件
的NetBeans 8.0.2
GlassFish服務器4.1
jdk1.8.0_40

+1

爲什麼使用「CriteriaUpdate」?由於您似乎在更新單一產品,爲什麼不簡單地「堅持」/「合併」產品呢? –

+0

它的工作,感謝您的幫助。 – blaze

回答

0

,當你有全程記錄你不應該被使用的ID爲CriteriaUpdate一個簡單的更新。只需使用

getEntiyManager().merge(t); 
+0

我還需要爲**品牌中的所有產品插入**交易**,我認爲這需要品牌中所有產品的批量更新。由於合併更新實體的記錄,如何執行批量更新? – blaze

+0

這是一個完全不同的問題,我建議您搜索JPA更新/插入查詢,如果您遇到問題,請回到SO。 –