2011-12-20 4 views
4

테이블 PORTATION_MODEL_SET을 (를) 작성해야합니다. 그리고 테이블을 반드에서 두 키와 테이블 PHONE_MODEL에서 하나의 키를 생성해야JPA. JoinTable과 두 개의 JoinColumns

enter image description here

내가 가진 코드 :

@Entity 
@Table(name="PORTATION") 
@SecondaryTable(name="PORTATION") 
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class JDBCPortation implements Portation { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    @ManyToOne(targetEntity=JDBCContentMetaData.class, fetch=FetchType.LAZY) 
    @JoinColumn(name="fk_content_id",nullable=false) 
    private JDBCContentMetaData content; 


    @ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY,targetEntity=JDBCPhoneModel.class) 
    @JoinTable(
      name="PORTATION_MODEL_SET", 
      joinColumns={ 
        @JoinColumn(table="PORTATION", name="fk_portation_id", referencedColumnName="id"), 
        @JoinColumn(table="PORTATION", name="fk_content_id", referencedColumnName="fk_content_id", nullable=true) 
        }, 
      [email protected](table="PHONE_MODEL",name="fk_phone_model_id", referencedColumnName="id")) 
    private List<PhoneModel> phoneModel; 
//more code..... 
    } 

이 :

@Entity 
@Table(name="PHONE_MODEL") 
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class JDBCPhoneModel implements PhoneModel { 

    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    @Column(name="wurfl_id",length=255,nullable=false) 
    private String idWurfl; 

    @Column(name="name",length=100,nullable=false) 
    private String modelName; 
} 

그리고이 :

@Entity 
@Table(name="CONTENT_META_DATA") 
public class JDBCContentMetaData implements ContentMetaData { 

    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    @OneToMany(mappedBy="content",cascade={CascadeType.PERSIST,CascadeType.MERGE},targetEntity=JDBCPortation.class,fetch=FetchType.LAZY) 
    private List<Portation> portations; 
} 

그리고 이렇게 :

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:476) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
    at ru.icb.cms.repository.db.jpa.repository.BasicRepository$$EnhancerByCGLIB$$e5fc35ad.saveForce(<generated>) 
    at ru.icb.cms.repository.db.domain.RepositoryObjectTest.testCreateContent(RepositoryObjectTest.java:62) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 

추신 :

JDBCPhoneModel phoneModel = new JDBCPhoneModel(); 
    phoneModel.setIdWurfl("nokia_c50"); 
    phoneModel.setModelName("c50"); 

    JDBCContentMetaData content = JDBCContentMetaData.getNewInstance(); 
    content.getMetaData().setName("goodaaar!"); 
    content.getMetaData().setTitle("goood win!"); 
    content.setType(portationType.getContentType()); 
    basicRepository.saveForce(content); 

    System.out.println("content_id:"+content.getId()); 
    JDBCPortation portation = JDBCPortation.getInstance(content); 
    portation.setBinPath("/var/www/abra.jpg"); 
    portation.setPortitionType(portationType); 
    //EXCEPTION IN SAVE FORCE 
    basicRepository.saveForce(portation); 

    portation.addPhoneModel(phoneModel); 
    basicRepository.updateForce(portation); 

하지만

@JoinColumn(name="fk_content_id", referencedColumnName="fk_content_id", nullable=true)

는 오류를 생성 당신은 inverseJoinColumns 정의에서 referencedColumnName 누락 된

@ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY,targetEntity=JDBCPhoneModel.class) 
@JoinTable(
     name="PORTATION_MODEL_SET", 
     joinColumns={ 
       @JoinColumn(table="PORTATION",name="fk_portation_id", referencedColumnName="id") 
       }, 
     [email protected](table="PHONE_MODEL",name="fk_phone_model_id", referencedColumnName="id")) 
private List<PhoneModel> phoneModel; 
+0

while 스택 추적을 게시하고 오류가 발생하면 상태를 표시 할 수 있습니까? – yair

+0

예제를 정리해 주시겠습니까? 당신의 테이블과 컬럼 이름은 모든 곳 ('CONTENT' 또는'CONTENT_META_DATA' ?,'fk_phone_model_id' 또는'fk_model_id'?)에 있습니다. 또한 내 대답의 코드를 사용하면 org.hibernate.AnnotationException'을 받았다고 설명했다. 스택 추적도 * 게시 할 수 있습니까? 또한'PORTATION_MODEL_SET'의'fk_content_id'가 불필요하다는 것을 눈치 채 셨습니다. 'fk_portation_id'가 주어지면 당신은 관련된'fk_content_id'와 관련 데이터를 얻을 수 있습니다. 또한,'@SecondaryTable (name = "PORTATION")'을'@SecondaryTable (name = "CONTENT")'로 변경해보십시오. –

답변

4
@ManyToMany(targetEntity = JDBCPhoneModel.class, 
      cascade = CascadeType.ALL, 
      fetch = FetchType.LAZY) 
@JoinTable(name = "PORTATION_MODEL_SET", 
      joinColumns = {@JoinColumn(table = "PORTATION", 
             name = "fk_portation_id", 
             referencedColumnName = "id"), 
          @JoinColumn(table = "PORTATION", 
             name = "fk_content_id",        
             referencedColumnName = "fk_content_id", 
             nullable = true)}, 
      inverseJoinColumns = @JoinColumn(table = "PHONE_MODEL", 
              name="fk_phone_model_id", 
              referencedColumnName = "id")) 
private List<PhoneModel> phoneModel; 

: 그것을 작동합니다. 작동하는지 확인하십시오.

+0

새로운 에러 :'원인 : org.hibernate.AnnotationException : 예상 된 보조 테이블을 찾을 수 없습니다 : ru.icb.cms.repository.db.domain.JDBCPortation'에 대한 PORTATION이 없습니다. – zen0n

+0

@ zen0n'PORTATION' 이름이 있습니까 데이터베이스에있는 테이블? 왜냐하면 당신의 질문은 테이블의 이름이'PORTATION' 대신'Portation' 인 그림을 보여주기 때문입니다 (Java 코드 조각에서 PORTATION_MODEL_SET을 대문자로 사용했기 때문에 대문자를 사용했습니다) . 테이블 이름에 대해서는 항상 데이터베이스에 정의 된 이름을 사용합니다. 이름을 가지고 놀아도 문제가 해결되지 않는다면 (아마도 그렇지 않을 것입니다.) 질문을 업데이트하고'PhoneModel' 엔티티 클래스도 게시하십시오. 또한, 코드의 어디에서나'@ SecondaryTable' 주석을 사용합니까? –

관련 문제