Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA@ManyToMany仅包含部分主键_Java_Jpa_Many To Many_Composite Primary Key - Fatal编程技术网

Java JPA@ManyToMany仅包含部分主键

Java JPA@ManyToMany仅包含部分主键,java,jpa,many-to-many,composite-primary-key,Java,Jpa,Many To Many,Composite Primary Key,我通过第三个表在两个表之间建立了多对多关系: TABLE_A A_TO_B TABLE_B --------- ------------- ------------ KEY (PK) KEY_A (PK, FK) KEY (PK) --some more Atributes KEY

我通过第三个表在两个表之间建立了多对多关系:

TABLE_A                      A_TO_B                    TABLE_B
---------                    -------------             ------------
KEY (PK)                     KEY_A (PK, FK)            KEY (PK)
--some more Atributes        KEY_B (PK, FK)            START_DATE (PK)
                             --some Attributes         END_DATE
                                                       --some Attributes
正如您所看到的,这个表结构的问题是
表B
有一个包含条目的起始日期的组合主键。这是为了能够有入口版本。我无法更改表格结构。我想通过
@ManyToMany
属性加入JPA中的
表A
表B
。但是JPA要求,
A到B
知道
表B的完整主键。但我完全可以忽略
开始日期
,只需使用
键B
获取特定
键a
表B
的所有条目
这是错误:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring_hibernate_configuration.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: referencedColumnNames(KEY_B) of de.mycompany.entity.model.TableA.listOfBs referencing de.mycompany.entity.model.TableB not mapped to a single property
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
    at de.mycompany.Start.main(Start.java:14)
Caused by: org.hibernate.AnnotationException: referencedColumnNames(KEY_B) of de.mycompany.entity.model.TableA.listOfBs referencing de.mycompany.entity.model.TableB not mapped to a single property
    at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:320)
    at org.hibernate.cfg.annotations.CollectionBinder.bindManytoManyInverseFk(CollectionBinder.java:1680)
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1560)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:725)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1589)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    ... 11 more
表A至表B
@实体
@表(name=“A到B”)
公共类AtoB{
@嵌入ID
私有原子id;
/*接球手和接球手*/
}
A到B的嵌入ID
公共类AtoBId实现可序列化{
@列(name=“KEY\u A”,nullable=false)
私钥;
@列(name=“KEY_B”,nullable=false)
私钥;
/*接球手和接球手*/
}
当我用另一个包含日期的假联接列定义
@manytomy
时,应用程序启动得很好

@ManyToMany(fetch=FetchType.EAGER)
@可接合(
name=“A到B”,
joinColumns=@JoinColumn(name=“KEY\u A”,
referencedColumnName=“KEY”),
inverseJoinColumns={@JoinColumn(name=“KEY_B”,
referencedColumnName=“KEY”),
@JoinCokumn(name=“SOME_DATE”,
referencedColumnName=“开始日期”)})
私人名单;

但这不会给我想要的结果。我只想将
A_\u B
TABLE_B
加入
KEY_B

,对于任何有类似问题的人,我最后做的是:

我在瞬态中列出了Bs,这意味着它不保存在DB中。然后我懒散地通过getter填充它:

@Entity
@Configurable
@Table(name = "TABLE_A")
public class TableA {
   @Id
   @Column(name = "KEY", nullable = false)
   private int key;

   @Transient
   private List<TableB> listOfBs;

   @Transient
   @Autowired
   AtoBRepository aToBRepository;

   @Transient
   @Autowired
   TableBRepository tableBRepository;

   public List<TableB> getListOfBs(){
      if (listOfBs == null){
         listOfBs = new ArrayList<>();
         List<AtoB> AtoBs = aToBRepository.findByIdKeyA(key);
         for (AtoB aToB : AtoBs){
            listOfBs.addAll(tableBRepository.findByIdKey(aToB.getKeyB));
         }
      }
      return listOfBs;
   }

   /* More Fields, Getters and setters*/
}
@实体
@可配置
@表(name=“表A”)
公共类表格{
@身份证
@列(name=“KEY”,nullable=false)
私钥;
@短暂的
私人名单;
@短暂的
@自动连线
原子性;原子性;
@短暂的
@自动连线
TableBRepository TableBRepository;
公共列表getListOfBs(){
if(listOfBs==null){
listOfBs=新的ArrayList();

列表

您可以使用从数据库创建实体类吗?类似这样的方法谢谢您的建议。我在Dali中尝试过。关系的配置对话框还请求PK:
开始日期