테이블 PORTATION_MODEL_SET을 (를) 작성해야합니다. 그리고 테이블을 반드에서 두 키와 테이블 PHONE_MODEL에서 하나의 키를 생성해야JPA. JoinTable과 두 개의 JoinColumns
내가 가진 코드 :
@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;
while 스택 추적을 게시하고 오류가 발생하면 상태를 표시 할 수 있습니까? – yair
예제를 정리해 주시겠습니까? 당신의 테이블과 컬럼 이름은 모든 곳 ('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")'로 변경해보십시오. –