您好,我正在尝试制作一个 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
实体:
@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/