使用DerbyDB实现一对多双向关系的Hibernate注释映射
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
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”)。将其从成功保存的第二个字段中删除。难道我不想将它与列字段一起使用,而只与添加的父引用一起使用一次吗?