mysql - JPA EclipseLink oneToMany 派生 ID 失败

标签 mysql jpa eclipselink foreign-key-relationship

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

相关文章:

java - Java Spring 中 POST 请求@ManyToOne 关系的 JSON 内容

java - @ManyToOne、@OneToMany 删除错误

java - HikariPool-1 - driverClassName 需要 jdbcUrl

mysql - 如何导入两个包都注册驱动程序mysql

jquery - 多雇主对员工管理

mysql - SQL 2 Left Join 带计数的查询

java - EclipseLink MOXy,对象图中的循环

mysql - Node + Passport + MySQL

spring - Spring-boot 是否通过@GeneratedValue 改变了 ids 自动增量的工作方式?

java - JPA/Eclipselink 使用条件对所有列值求和