与DerbyDB的一对多双向关系的休眠注释映射

问题描述 投票:0回答:1

Hibernate的新增功能,我正在尝试完成一个非常简单的任务,但最终却出现了很多错误。

具有一对多关系的两个表CartItems。我想在父表实体上调用save,并希望子表也得到保存。

enter image description here

脚本1:

CREATE TABLE cart
(
    cart_id INTEGER NOT NULL, 
    reference_number INTEGER,
    PRIMARY KEY (cart_id)
);

CREATE TABLE item
(
    item_id INTEGER NOT NULL,
    cart_id INTEGER NOT NULL,
    name Varchar(255) ,
    description Varchar(255) ,
    PRIMARY KEY (item_id),
    FOREIGN KEY (cart_id) REFERENCES cart
);

使用下面的休眠代码生成是Entity类。

@Entity
@Table(name = "CART", schema = "MYSCHEMA")
public class Cart implements java.io.Serializable {

    private int cartId;
    private Integer referenceNumber;
    private List<Item> items = new ArrayList<Item>();

    @Id
    @Column(name = "CART_ID", unique = true, nullable = false)
    public int getCartId() {
        return this.cartId;
    }

    @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, orphanRemoval = true)
    public List<Item> getItems() {
        return items;
    }

    public void addItem(Item item) {
        items.add(item);
        item.setCart(this);
    }

    public void removeComment(Item item) {
        items.remove(item);
        item.setCart(this);
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

    // Excluding rest of the Getters and Setterss
}


@Entity
@Table(name = "ITEM", schema = "MYSCHEMA")
public class Item implements java.io.Serializable {

    private int itemId;
    private int cartId;
    private String name;
    private String description;
    private Cart cart;

    @Id
    @Column(name = "ITEM_ID", unique = true, nullable = false)
    public int getItemId() {
        return this.itemId;
    }

    @ManyToOne
    @JoinColumn(name = "cart_id", nullable = false, insertable = false, updatable = false)
    public Cart getCart() {
        return cart;
    }

    public void setCart(Cart cart) {
        cart = cart;
    }

    // Excluding rest of the Getters and Setterss
}

运行时具有此设置。

    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();

    Cart cart = new Cart();
    cart.setReferenceNumber(333);

    Item item1 = new Item();
    item1.setName("itemONe");
    item1.setDescription("itemOneDescription");
    item1.setCart(cart);
    cart.addItem(item1);

    Item item2 = new Item();
    item2.setName("itemONe");
    item2.setDescription("itemOneDescription");
    item2.setCart(cart);
    cart.addItem(item2);

    session.save(cart);
    session.getTransaction().commit();

它给出以下错误。

线程“ main”中的异常org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与该会话相关联:[com.testHibernate.models.Item#0]

这是有意义的,因为Hibernate和Database都没有处理主键的自动生成。因此,如果我仅使用Item1来运行上述代码,它将起作用并保存两条记录。

如果将数据库更改为以下数据库,则通过数据库生成ID

脚本2:

CREATE TABLE cart
(
    cart_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    reference_number INTEGER,
    PRIMARY KEY (cart_id)
);

CREATE TABLE item
(
    item_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    cart_id INTEGER NOT NULL,
    name Varchar(255) ,
    description Varchar(255) ,
    PRIMARY KEY (item_id),
    FOREIGN KEY (cart_id) REFERENCES cart
);

保持与上述相同的Entity类,它无效。出现相同的错误。

我在两个类中都尝试将@GeneratedValue(strategy = GenerationType.IDENTITY)与PrimeryKey字段一起使用,并且保存时出现以下错误。

错误:对表'ITEM'的INSERT导致键(0)违反了外键约束'SQL0000000002-06ba0cd1-016e-2cf2-dad9-ffff908894b5'。该语句已回滚。

Hibernate是否应该使用cascade = CascadeType.ALL处理此问题?

我想念什么?

Hibernate v5.4.4Derby DB v10.15.1.3

hibernate derby
1个回答
1
投票

在第一种情况下,您具有2个具有相同ID的项目实体-零。

对于第二个错误,将联接列定义为cart_id时,如何设置不可为空的外键列insertable = false, updatable = false?删除这些属性,它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.