gpt4 book ai didi

mysql - JPA EclipseLink oneToMany 派生 ID 失败

转载 作者:行者123 更新时间:2023-11-29 22:47:57 25 4
gpt4 key购买 nike

您好,我正在尝试制作一个 OneToMany 关系持久性的示例,但出现以下错误:

Exception Description: Invalid composite primary key specification. The names of the primary key fields or properties in the primary key class [entitys.OrderItemPK] and those of the entity bean class [class entitys.OrderItem] must correspond and their types must be the same. Also, ensure that you have specified ID elements for the corresponding attributes in XML and/or an @Id on the corresponding fields or properties of the entity class.

注意:我正在使用 EclipseLink 和 MySQL DB

The database design

实体:

@Entity
public class CustomerOrder implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idOrder")
private Integer idOrder;

@Basic(optional = false)
@Column(name = "orderText")
private String orderText;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "customerOrder")
private Collection<OrderItem> orderItemCollection;

public CustomerOrder() {
}
}
@Entity
@IdClass(OrderItemPK.class)
public class OrderItem implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected OrderItemPK orderItemPK;

@Basic(optional = false)
@Column(name = "itemDesc")
private String itemDesc;

@Id
@ManyToOne(optional = false)
@JoinColumns({
@JoinColumn(name="idOrder", referencedColumnName="idOrder"),
@JoinColumn(name="ItemNumber", referencedColumnName="ItemNumber")
})
//@JoinColumn(name = "idOrder", referencedColumnName = "idOrder", insertable = false, updatable = false)
private CustomerOrder customerOrder;
private CustomerOrder customerOrder;

public OrderItem() {
this.orderItemPK = new OrderItemPK();
}
}
@Embeddable
public class OrderItemPK implements Serializable {
@Basic(optional = false)
@Column(name = "idOrder")
private int idOrder;

@Basic(optional = false)
@Column(name = "itemNumber")
private int itemNumber;

public OrderItemPK() {
}
}

测试来源:

public static void main(String[] args) {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();

em.getTransaction().begin();

// Fill the items fileds
OrderItem item = new OrderItem();
item.setItemDesc("Item Text");

// Fill the orders fields
CustomerOrder order = new CustomerOrder();
order.setOrderText("Order text");

// Fill the relationship fields
order.getOrderItemCollection().add(item);
item.setCustomerOrder(order);

em.persist(order);
em.getTransaction().commit();
}

我不知道我做错了什么,欢迎任何建议。

最佳答案

我设法通过删除 idClass 注释并添加 @MapId 解决了问题

这是最终代码:

@Entity
@Table(name = "Orders")
public class CustomerOrder implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idOrder")
private Integer idOrder;
@Basic(optional = false)
@Column(name = "orderText")
private String orderText;

@OneToMany(mappedBy = "customerOrder", cascade = CascadeType.ALL)
private Collection<OrderItem> orderItemCollection;

public CustomerOrder() {
}

@Entity
@Table(name = "OrdersItems")
public class OrderItem implements Serializable {

private static final long serialVersionUID = 1L;
@EmbeddedId
protected OrderItemPK orderItemPK;
@Basic(optional = false)

@Column(name = "itemDesc")
private String itemDesc;

@MapsId("idOrder")
@ManyToOne(optional = false)
@JoinColumn(name = "idOrder", referencedColumnName = "idOrder", nullable = false)
private CustomerOrder customerOrder;

public OrderItem() {
this.orderItemPK = new OrderItemPK();
}

@Embeddable
public class OrderItemPK implements Serializable {
@Basic(optional = false)
@Column(name = "idOrder")
private int idOrder;
@Basic(optional = false)
@Column(name = "itemNumber")
private int itemNumber;

public OrderItemPK() {
}

public static void main(String[] args) {

factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();

em.getTransaction().begin();

// Fill the order item
OrderItem item = new OrderItem();
item.getOrderItemPK().setItemNumber(1);
item.setItemDesc("Product Name");

// Fill the order
CustomerOrder order = new CustomerOrder();
order.setOrderText("Testing");

// Create relationship
order.getOrderItemCollection().add(item);
item.setCustomerOrder(order);

// Persist
em.persist(order);
em.getTransaction().commit();
}

但是我无法让它与 IdClass 一起工作,这是源代码

@Embeddable
public class OrderItemPK implements Serializable {

@Basic(optional = false)
@Column(name = "idOrder")
private Integer idOrder;

@Basic(optional = false)
@Column(name = "ItemNumber")
private Integer itemNumber;

public OrderItemPK() {
}

@Entity
@IdClass(OrderItemPK.class)
public class OrderItem implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name = "itemNumber")
private Integer itemNumber;

@Basic(optional = false)
@Column(name = "itemDesc")
private String itemDesc;

@MapsId("idOrder")
@ManyToOne(optional = false)
@JoinColumn(name = "idOrder", referencedColumnName = "idOrder", nullable = false)
private CustomerOrder customerOrder;

public OrderItem() {
}

@Entity
public class CustomerOrder implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idOrder")
private Integer idOrder;

@Basic(optional = false)
@Column(name = "OrderText")
private String orderText;

@OneToMany(mappedBy = "customerOrder", cascade = CascadeType.ALL)
private Collection<OrderItem> orderItemCollection;

public CustomerOrder() {
this.orderItemCollection = new ArrayList();
}

关于mysql - JPA EclipseLink oneToMany 派生 ID 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29012099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com