bda*_*lik 5 jpa eclipselink java-ee-6 jpa-2.0
我正在尝试创建两个实体,其中两个实体都有embeddedIds.其中一个实体有2个引用另一个实体,其中这两个引用都与ManyToOne相关.
示例代码如下:
@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;
...
}
Run Code Online (Sandbox Code Playgroud)
问题是在为RelatedItem实体创建外键时,我得到了一个SQLException.这是第二个失败的ManyToOne关系.外键生成sql如下,
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)
Run Code Online (Sandbox Code Playgroud)
由于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)
Run Code Online (Sandbox Code Playgroud)
我尝试更改"JoinColumn"的顺序,但结果没有改变.我还尝试重命名字段以检查持久性提供程序是否按列名选择顺序,但结果再次没有更改.
那么,有没有办法强制执行列排序?
ps我使用以下内容:
编辑: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);
Run Code Online (Sandbox Code Playgroud)
请包含堆栈跟踪。但是,我强烈建议您跳过 @JoinColumn 标记,除非您有充分的理由自己指定外键。通过在其中一个方向上指定mappedBy属性,JPA可以弄清楚自己要做什么。
Java EE 6 和 JPA 投入了大量精力来启用约定优于配置,这意味着大多数时候,一切都可以开箱即用。这对于程序员来说是理想的,因为您无需担心样板代码,对于 JPA 和 Jave EE 容器实现者来说也是理想的,因为这使他们可以自由地选择性能最佳的解决方案。通过自己声明外键关系,您和 JPA 都失去了这一优势。
编辑:事实上,我怀疑指定mappedBy 和指定@JoinTable 可能是问题的根本原因。但我需要查看堆栈跟踪才能确定。
| 归档时间: |
|
| 查看次数: |
3402 次 |
| 最近记录: |