JPA。 JoinTable和两个JoinColumns [英] JPA. JoinTable and two JoinColumns

查看:149
本文介绍了JPA。 JoinTable和两个JoinColumns的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要创建表PORTATION_MODEL_SET。我需要从table portation和表phone_model中的一个键创建两个键




我有代码:

 <$ 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public($)
@Table 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 ,
joinColumn = {
@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))
私人列表< PhoneModel> phoneModel;
//更多代码.....
}



  @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实现ContentMetaData {

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

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

我这样做:

  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 FOR SAVE FORCE
basicRepository.saveForce(portation);

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

但是


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

生成错误:

  org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是javax.persistence.RollbackException:在org.springframework.transaction.support的org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:476)
处提交事务
时出错。 AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
在org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java: 172)
at org.springframework.aop.framework.Cglib2AopProxy $ DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
在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)$ b $ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)$ b $ sun 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)
在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)

PS它适用于:

  @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)
},
inverseJoinColumns = @ JoinColumn(table =PHONE_MODEL,name =fk_phone_model_id,referencedColumnName =id))
private List< PhoneModel> phoneModel;


解决方案

  @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))
私人列表< PhoneModel> phoneModel;

您错过了 referencedColumnName code> inverseJoinColumns 定义。请看看它是否适合你。


I need to create table PORTATION_MODEL_SET. And I need to create two keys from table portation and one key from table phone_model

I have code:

@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)
                    },
            inverseJoinColumns=@JoinColumn(table="PHONE_MODEL",name="fk_phone_model_id", referencedColumnName="id"))
    private List<PhoneModel> phoneModel;
//more code.....
    }

and this:

@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;
}

And this:

@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;
}

And I do this:

    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);

but

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

generate error:

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)

P.S. it works for:

@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")
                },
        inverseJoinColumns=@JoinColumn(table="PHONE_MODEL",name="fk_phone_model_id", referencedColumnName="id"))
private List<PhoneModel> phoneModel;

解决方案

@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;

You were missing the referencedColumnName from the inverseJoinColumns definition. Please see if it's works for you.

这篇关于JPA。 JoinTable和两个JoinColumns的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆