Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DerbyDB实现一对多双向关系的Hibernate注释映射_Hibernate_Derby - Fatal编程技术网

使用DerbyDB实现一对多双向关系的Hibernate注释映射

使用DerbyDB实现一对多双向关系的Hibernate注释映射,hibernate,derby,Hibernate,Derby,Hibernate的新功能,我试图实现一个非常简单的任务,但最终却以错误的数量而告终 两个具有一对多关系的表Cart和Items。我想对父表实体调用save,并希望子表也被保存 脚本1: CREATE TABLE cart ( cart_id INTEGER NOT NULL, reference_number INTEGER, PRIMARY KEY (cart_id) ); CREATE TABLE item ( item_id INTEGER NOT

Hibernate的新功能,我试图实现一个非常简单的任务,但最终却以错误的数量而告终

两个具有一对多关系的表
Cart
Items
。我想对父表实体调用save,并希望子表也被保存

脚本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
);
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
);
使用hibernate代码生成以下实体类

@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
}

它给出了以下错误

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

这说明Hibernate和数据库都没有处理主键的自动生成。因此,如果我使用
Item1
运行上面的代码,它只工作并保存两条记录

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

脚本2:

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
);
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
);
如上图所示,保持实体类不变,则不起作用。同样的错误也会出现

我尝试将
@GeneratedValue(strategy=GenerationType.IDENTITY)
与两个类中的PrimeryKey字段一起使用,保存时显示以下错误

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

Hibernate不是应该用
cascade=CascadeType.ALL来处理这个问题吗

我错过了什么

Hibernate v5.4.4
Derby DB v10.15.1.3

在第一种情况下,有两个条目实体具有相同的ID-零


对于第二个错误,当您将联接列定义为
insertable=false,updateable=false
时,如何设置不可为空的外键列
cart\u id
?删除这些属性,它应该会工作。

噢!那是一个很大的疏忽。但现在它通过
SQLGrammarException
列“CART\u ID”在项目中出现了不止一次。我在cart字段上有@JoinColumn(name=“card\u id”),该字段引用父表,在
cartId
上有@Column(name=“cart\u id”)。将其从成功保存的第二个字段中删除。难道我不想将它与列字段一起使用,而只与添加的父引用一起使用一次吗?