2016-11-22 6 views
0

Jboss 4에 배포 된 기존의 작동중인 Hibernate 3 코드로 작업 중이며 이제는 Wildfly 10 (Hibernate 5)에 배포하려고합니다. 배포시에 실시하는 검증하는 동안 다음과 같은 메시지가 표시됩니다Hibernate에서 두 엔티티는 어떻게 세 번째 엔티티와 many-to-many 단방향 관계를 가질 수 있습니까?

org.hibernate.persister.walking.spi.WalkingException: Association has already been visited: AssociationKey(table=pur_DemandDtl_DemandHeader, columns={DemandEventHeaderTRIk}) 

내가 요약을주지

먼저 (내가 아래의 전체 스택을 표시합니다) : 포함 3 종류가 있습니다. 2 클래스에는 ManyToMany로 주석이 지정된 멤버 집합이 있으며 단방향입니다. 세트에는 3 등급의 멤버가 있습니다.

3 개의 클래스 각각에 해당하는 3 개의 테이블이 있습니다. 두 번째 테이블은 두 가지 연관을 나타냅니다. 이 네 번째 표에는 3 개의 열이 있습니다. 각 열은 표 중 하나에 해당합니다. 명백히 각 행에서 두 테이블과 연관된 두 개의 열 중 하나는 널값을가집니다.

나는 Hibernate에 대한 경험이 거의 없지만, 각각의 관계가 내가 본 모든 예제에서와 똑같이 정의 된 것처럼 보인다. 내 마음 속의 유일한 질문은 다음과 같다. 1) 제 3의 테이블과의 관계에 2 개의 테이블이 있기 때문에 나는 다른 것을해야만 하는가? 2) 두 협회를 같은 협회 테이블에 두는 것이 합법적입니까? 3) 문제가되는 처음 2 과목의 계층 구조입니까?

이제 코드를 보여 드리겠습니다. 나는 몇몇 세부 사항을 생략하고 필요한 경우 나중에 추가 할 것이다.

처음 두 클래스는 PromoDtl 및 ReserveDtl입니다. 이 클래스는 공통 상위 클래스 인 PromoReserveDtl을 공유하며 각 클래스는 세 번째 클래스 인 DemandEventHeaderTriggerRecord에 대해 단방향 ManyToMany 관계를 갖습니다. 다음과 같이

@MappedSuperclass 
public abstract class PromoReserveDtl implements Serializable,Comparable<PromoReserveDtl>{ 

    private Integer promoReserveDtlIk; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name = "PromoReserveDtlIk") 
    public Integer getPromoReserveDtlIk() { 
     return promoReserveDtlIk; 
    } 
    protected Set<DemandEventHeaderTriggerRecord> demandEventHeaderTriggerRecord = new HashSet<DemandEventHeaderTriggerRecord>(); 
    public void setDemandEventHeaderTriggerRecord(Set<DemandEventHeaderTriggerRecord> demandEventHeaderTriggerRecord) { 
     this.demandEventHeaderTriggerRecord = demandEventHeaderTriggerRecord; 
    } 
    // other stuff 
} 

@Entity 
@Table(name="pur_PromoDtl") 
public class PromoDtl extends PromoReserveDtl implements Serializable{ 
    @ManyToMany(fetch = FetchType.EAGER,cascade = { CascadeType.ALL }) 
    @JoinTable(name="pur_DemandDtl_DemandHeader", 
      [email protected](name="PromoDtlIk"), 
      [email protected](name="DemandEventHeaderTRIk")) 
    public Set<DemandEventHeaderTriggerRecord> getDemandEventHeaderTriggerRecord() { 
     return demandEventHeaderTriggerRecord; 
    } 
    // other stuff 
} 

@Entity 
@Table(name="pur_ReserveDtl") 
public class ReserveDtl extends PromoReserveDtl implements Serializable { 
    @ManyToMany(fetch = FetchType.EAGER,cascade = { CascadeType.ALL }) 
    @JoinTable(name="pur_DemandDtl_DemandHeader", 
      [email protected](name="ReserveDtlIk"), 
      [email protected](name="DemandEventHeaderTRIk")) 
    public Set<DemandEventHeaderTriggerRecord> getDemandEventHeaderTriggerRecord() { 
     return demandEventHeaderTriggerRecord; 
    } 
    // other stuff 
} 

@Entity 
@Table(name="pur_DemandEventHeaderTriggerRecord") 
public class DemandEventHeaderTriggerRecord implements Serializable{ 
    private Integer demandEventHeaderTRIk; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "DemandEventHeaderTRIk") 
    public Integer getDemandEventHeaderTRIk() { 
     return demandEventHeaderTRIk; 
    } 
    public boolean equals(Object other) { 
     //... 
    } 
    public int hashCode() { 
     //... 
    } 
} 

연관성 테이블이 정의된다 : 당신의 시간

2016-11-22 14:51:07,765 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 84) MSC000001: Failed to start service jboss.persistenceunit."InSyncEar-11.0.0-SNAPSHOT.ear/PurchasingServices.jar#purchasingpersistence": org.jboss.msc.service.StartException in service jboss.persistenceunit."InSyncEar-11.0.0-SNAPSHOT.ear/PurchasingServices.jar#purchasingpersistence": javax.persistence.PersistenceException: [PersistenceUnit: purchasingpersistence] Unable to build Hibernate SessionFactory 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:179) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:121) 
at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:193) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
at org.jboss.threads.JBossThread.run(JBossThread.java:320) 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: purchasingpersistence] Unable to build Hibernate SessionFactory 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) 
at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:161) 
... 7 more 
Caused by: org.hibernate.persister.walking.spi.WalkingException: Association has already been visited: AssociationKey(table=pur_DemandDtl_DemandHeader, columns={DemandEventHeaderTRIk}) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.addAssociationKey(MetamodelGraphWalker.java:281) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitCollectionElements(MetamodelGraphWalker.java:257) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitCollectionDefinition(MetamodelGraphWalker.java:208) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAssociation(MetamodelGraphWalker.java:185) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAttributeDefinition(MetamodelGraphWalker.java:160) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAttributes(MetamodelGraphWalker.java:131) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitEntityDefinition(MetamodelGraphWalker.java:94) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitCollectionElements(MetamodelGraphWalker.java:264) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitCollectionDefinition(MetamodelGraphWalker.java:208) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAssociation(MetamodelGraphWalker.java:185) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAttributeDefinition(MetamodelGraphWalker.java:160) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAttributes(MetamodelGraphWalker.java:131) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitEntityDefinition(MetamodelGraphWalker.java:94) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAssociation(MetamodelGraphWalker.java:188) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAttributeDefinition(MetamodelGraphWalker.java:160) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitAttributes(MetamodelGraphWalker.java:131) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitEntityDefinition(MetamodelGraphWalker.java:94) 
at org.hibernate.persister.walking.spi.MetamodelGraphWalker.visitEntity(MetamodelGraphWalker.java:55) 
at org.hibernate.loader.plan.build.spi.MetamodelDrivenLoadPlanBuilder.buildRootEntityLoadPlan(MetamodelDrivenLoadPlanBuilder.java:39) 
at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.<init>(AbstractLoadPlanBasedEntityLoader.java:81) 
at org.hibernate.loader.entity.plan.EntityLoader.<init>(EntityLoader.java:103) 
at org.hibernate.loader.entity.plan.EntityLoader.<init>(EntityLoader.java:38) 
at org.hibernate.loader.entity.plan.EntityLoader$Builder.byUniqueKey(EntityLoader.java:83) 
at org.hibernate.loader.entity.plan.EntityLoader$Builder.byPrimaryKey(EntityLoader.java:77) 
at org.hibernate.loader.entity.plan.AbstractBatchingEntityLoaderBuilder.buildNonBatchingLoader(AbstractBatchingEntityLoaderBuilder.java:30) 
at org.hibernate.loader.entity.BatchingEntityLoaderBuilder.buildLoader(BatchingEntityLoaderBuilder.java:59) 
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:2254) 
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:2276) 
at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3876) 
at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3858) 
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:444) 
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) 
... 9 more 

감사 : 배포에 로그인

CREATE TABLE [dbo].[pur_DemandDtl_DemandHeader](
    [PromoDtlIk] [int] NULL, 
    [ReserveDtlIk] [int] NULL, 
    [DemandEventHeaderTRIk] [int] NOT NULL 
) ON [PRIMARY] 

전체 스택 추적은 다음과 같다.

답변

1

또한 BOTH 연관을 나타내는 네 번째 테이블이 있습니다. 이 네 번째 표에는 3 개의 열이 있습니다. 각 열은 테이블 중 하나에 해당합니다. 분명히 각 행에있는 두 개의 열 중 하나가 과 연결된 null 열이 있습니다.

분명히 사과와 바나나를 같은 테이블에 저장하십시오. JoinTable의 목적은 정확히 하나의 관계 만 저장하는 것입니다. JoinTable에는 각면에있는 엔티티 ID가있는 두 개의 열이 있습니다 (복합 키를 사용할 수 있는지 여부는 모르지만 그에 따라 더 많은 열이 있습니다). 최대 절전 모드는 null 값을 어떻게 처리해야합니까? 그들을 걸러 내시겠습니까? 또는 집합에 null을 추가 하시겠습니까?

1) 세 번째 테이블과의 관계에 2 개의 테이블이 있으므로 다른 작업을 수행해야합니까?

이 테이블을 두 개로 나눠야합니다.

2) 동일한 연결에 두 연결을 모두 유지하는 것이 합법입니까 ?

사양 합법 : 잘 모른다. 그러나 그것은 말이되지 않습니다.

3) 문제가있는 처음 2 개 클래스의 계층 구조입니까? 나는 테이블을 분할하고 지금 문제가 사라로

번호

+0

미란다, 나는 정답으로 이것을 확인. 그러나, 나는 두 엔티티 사이의 관계가 배타적 인 테이블에 있어야하며 더 일반적인 테이블의 2 또는 3 열만 사용하여 구현할 수 없다고 생각하는 것이 어렵습니다. 네, 최대 절전 모드가 null 값을 필터링하기 위해 기대할 것입니다 (null은 엔터티가 아니기 때문에). 이것이 JBoss 4.2.3과 Hibernate 3에 있었던 방식입니다. Wildfly 10으로 마이그레이션하기 전에 코드를 실행하고있었습니다. 그래도 고맙지 만 적어도 당신의 대답 덕분에 문제가 해결되었습니다. – inor