두 엔터티가 모두 포함 된 두 개의 엔터티를 만들려고합니다. 엔티티 중 하나는 다른 엔티티에 대한 두 개의 참조를 가지며, 두 참조 모두 ManyToOne과 관련됩니다.Java EE 6 JPA 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;
...
}
문제점은 RelatedItem 엔티티에 대한 외래 키를 작성하는 중 SQLException이 발생합니다. 실패한 두 번째 ManyToOne 관계입니다. 외래 키 생성 SQL은이 사항이 오류가 발생하는 인해 MySQL, 항목 테이블 이후
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)
다음 item_client_id에 의해 해당 itemId에 의해 처음 인덱싱, 다음과 같습니다.
나는 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.s.
- MySQL은 5.1
- 는 EclipseLink 2.0.0
- 자바 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);
무엇이 오류입니까? 제약 조건에서 필드의 순서는 영향을 미치지 않아야합니다.(오류를 생성하기 위해 생성 된 SQL을 포함하십시오.) – James
제약 조건의 순서는 MySQL에서 중요합니다. 인덱스의 첫 번째 키가 제약 목록의 첫 번째 열과 동일한 대상 테이블에 해당 인덱스가 있어야합니다. – bdaylik