Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Java EE 6 JPA 2多工单关系创建无效外键_Jpa_Eclipselink_Jpa 2.0_Java Ee 6 - Fatal编程技术网

Java EE 6 JPA 2多工单关系创建无效外键

Java EE 6 JPA 2多工单关系创建无效外键,jpa,eclipselink,jpa-2.0,java-ee-6,Jpa,Eclipselink,Jpa 2.0,Java Ee 6,我试图创建两个实体,其中两个实体都有嵌入的ID。其中一个实体有两个对另一个实体的引用,其中两个引用都与多个实体相关 示例代码写在下面 @Embeddable public class ItemPK { @Column(nullable = false, length = 100) private String itemId; @Column(name = "item_client_id", nullable = false) private int clientId; ..

我试图创建两个实体,其中两个实体都有嵌入的ID。其中一个实体有两个对另一个实体的引用,其中两个引用都与多个实体相关

示例代码写在下面

@Embeddable
public class ItemPK {
  @Column(nullable = false, length = 100)
  private String itemId;
  @Column(name = "item_client_id", nullable = false)
  private int clientId; 
  ...
}

@Entity
@Table(name = "item")
public class Item {
  @EmbeddedId
  private ItemPK id;

  @ManyToOne
  @JoinColumn(name = "item_client_id")
  private Client client;

  @OneToMany(mappedBy="item", cascade = CascadeType.ALL, orphanRemoval = true)
  private Set<RelatedItem> relatedItems;

  @OneToMany(mappedBy="relatedItem", cascade = CascadeType.ALL, orphanRemoval = true)
  private Set<RelatedItem> relatedItemsRHS;
  ...
}

@Embeddable
public class RelatedItemPK {
  @Column(name = "itemId", length = 100, nullable = false)
  private String itemId;
  @Column(name = "item_client_id", nullable = false)
  private int clientId;
  @Column(name = "relatedItemId", length = 100, nullable = false)
  private String relatedItemId;
  @Column(name = "related_item_client_id", nullable = false)
  private int relatedItemClientId;
  ...
}

@Entity
@Table(name = "related_item")
public class RelatedItem {
  @EmbeddedId
  private RelatedItemPK id;

  @ManyToOne(cascade = CascadeType.ALL, optional = false)
  @JoinColumns({
    @JoinColumn(name="itemId", referencedColumnName="itemId", insertable=false, updatable=false),
    @JoinColumn(name="item_client_id", referencedColumnName="item_client_id", insertable=false, updatable=false)
  })
  private Item item;
  @ManyToOne(cascade = CascadeType.ALL, optional = false)
  @JoinColumns({
    @JoinColumn(name="related_item_client_id", referencedColumnName="item_client_id", insertable=false, updatable=false),
    @JoinColumn(name="relatedItemId", referencedColumnName="itemId", insertable=false, updatable=false)
  })
  private Item relatedItem;
  ...
}
由于item表首先由itemId索引,然后由item_client_id索引,因此该语句导致MySQL产生错误

我想切换列的位置,这样SQL应该如下所示

ALTER TABLE related_item ADD CONSTRAINT FK_related_item_relatedItemId FOREIGN KEY (relatedItemId, related_item_client_id) REFERENCES item (itemId,item_client_id)
我试图改变“JoinColumn”的顺序,但结果没有改变。我还尝试重命名字段,以检查持久性提供程序是否选择按列名排序,但结果仍然没有改变

那么,有没有办法强制执行列顺序

p、 我使用以下材料:

  • MySQL 5.1
  • 日食2.0.0
  • Java EE 6
  • JPA 2
  • 玻璃鱼v3
编辑:EclipseLink生成以下SQL,无法运行

CREATE TABLE related_item (SIMILARITY DOUBLE, widget_id INTEGER NOT NULL, relatedItemId VARCHAR(100) NOT NULL, itemId VARCHAR(100) NOT NULL, related_item_client_id INTEGER NOT NULL, item_client_id INTEGER NOT NULL, PRIMARY KEY (widget_id, relatedItemId, itemId, related_item_client_id, item_client_id));
CREATE TABLE item (IMAGEURL VARCHAR(2048), STATUS VARCHAR(64), URL VARCHAR(2048), PRICE DOUBLE, STOCK INTEGER, DESCRIPTION TEXT(64000), NAME VARCHAR(255), ITEMID VARCHAR(100) NOT NULL, item_client_id INTEGER NOT NULL, PRIMARY KEY (ITEMID, item_client_id));
ALTER TABLE related_item ADD CONSTRAINT FK_related_item_itemId FOREIGN KEY (itemId, item_client_id) REFERENCES item (itemId, item_client_id);
ALTER TABLE related_item ADD CONSTRAINT FK_related_item_related_item_client_id FOREIGN KEY (related_item_client_id, relatedItemId) REFERENCES item (item_client_id, itemId);
ALTER TABLE item ADD CONSTRAINT FK_item_item_client_id FOREIGN KEY (item_client_id) REFERENCES client (ID);

请包括堆栈跟踪。但是,我强烈建议您跳过@JoinColumn标记,除非您有很好的理由自己指定外键。通过在其中一个方向上指定mappedBy属性,JPA可以自己决定做什么

JavaEE6和JPA在启用约定优先于配置方面投入了大量精力,这意味着大多数情况下,事情都是开箱即用的。对于程序员来说,这是可取的,因为您需要担心的锅炉板代码更少;对于JPA和Jave EE容器实现者来说,这是可取的,因为它让他们可以自由选择性能最好的解决方案。通过自己声明外键关系,您和JPA都失去了这一优势


编辑:事实上,我怀疑指定mappedBy和指定@JoinTable可能是问题的根本原因。但是我需要查看堆栈跟踪才能确定。列的顺序应该无关紧要。如果是,那么您可以更改索引中的顺序以匹配,或者更改列出主键的顺序,或者只使用脚本生成DDL。

错误是什么?约束中字段的顺序应该没有影响。(还包括生成错误的SQL。约束的顺序在MySQL中很重要。目标表中必须有一个对应的索引,其中索引的第一个键等于约束列表中的第一列。我在许多不同的地方使用mappedBy和@JoinColumns,但这是我唯一拥有的索引。)g一个问题。顺便说一句:我尝试删除@JoinColumns,但出现以下异常,字段[related\u item.item\u client\u id]存在多个可写映射。只有一个可以定义为可写,所有其他映射都必须指定为只读。我不知道任何其他方法可以将字段指定为只读。
CREATE TABLE related_item (SIMILARITY DOUBLE, widget_id INTEGER NOT NULL, relatedItemId VARCHAR(100) NOT NULL, itemId VARCHAR(100) NOT NULL, related_item_client_id INTEGER NOT NULL, item_client_id INTEGER NOT NULL, PRIMARY KEY (widget_id, relatedItemId, itemId, related_item_client_id, item_client_id));
CREATE TABLE item (IMAGEURL VARCHAR(2048), STATUS VARCHAR(64), URL VARCHAR(2048), PRICE DOUBLE, STOCK INTEGER, DESCRIPTION TEXT(64000), NAME VARCHAR(255), ITEMID VARCHAR(100) NOT NULL, item_client_id INTEGER NOT NULL, PRIMARY KEY (ITEMID, item_client_id));
ALTER TABLE related_item ADD CONSTRAINT FK_related_item_itemId FOREIGN KEY (itemId, item_client_id) REFERENCES item (itemId, item_client_id);
ALTER TABLE related_item ADD CONSTRAINT FK_related_item_related_item_client_id FOREIGN KEY (related_item_client_id, relatedItemId) REFERENCES item (item_client_id, itemId);
ALTER TABLE item ADD CONSTRAINT FK_item_item_client_id FOREIGN KEY (item_client_id) REFERENCES client (ID);