Java JPA OneToMany映射异常:字段XXX不能声明它被另一个字段映射

Java JPA OneToMany映射异常:字段XXX不能声明它被另一个字段映射,java,jpa,Java,Jpa,在我的项目中,我有下面报告的类,带有双向关系映射。当我试图通过JPA读取DataProviderImpl类型的对象时,我遇到了以下异常: org.apache.openjpa.persistence.ArgumentException:字段“persistence.entity.DataProviderImpl.methods”不能声明它由另一个字段映射。它的映射策略(org.apache.openjpa.jdbc.meta.strats.HandlerCollectionTableFieldS

在我的项目中,我有下面报告的类,带有双向关系映射。当我试图通过JPA读取DataProviderImpl类型的对象时,我遇到了以下异常:

org.apache.openjpa.persistence.ArgumentException:字段“persistence.entity.DataProviderImpl.methods”不能声明它由另一个字段映射。它的映射策略(org.apache.openjpa.jdbc.meta.strats.HandlerCollectionTableFieldStrategy)不支持其他字段的映射

我已经检查了其他问题,但似乎没有什么适用于我的情况。有什么提示吗? 提前谢谢你

<persistence
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">

<persistence-unit name="DataProvider" transaction-type="JTA"> <!-- transaction-type="RESOURCE_LOCAL"  info at:  http://tomee.apache.org/jpa-concepts.html -->
    <jta-data-source>
        osgi:service/jdbc/mysqlPoolXAds
    </jta-data-source>
    <non-jta-data-source>
        osgi:service/jdbc/mysqlds
    </non-jta-data-source>      
    <class>persistence.entity.DataProviderImpl</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
    </properties>
</persistence-unit>
<persistence-unit name="RestMethod" transaction-type="JTA"> <!-- transaction-type="RESOURCE_LOCAL"  info at:    http://tomee.apache.org/jpa-concepts.html -->
    <jta-data-source>
        osgi:service/jdbc/mysqlPoolXAds
    </jta-data-source>
    <non-jta-data-source>
        osgi:service/jdbc/mysqlds
    </non-jta-data-source>      
    <class>persistence.entity.RestMethodImpl</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
    </properties>
</persistence-unit>


假设您使用了来自
javax.persistence
的导入语句,那么您的映射注释肯定应该使用额外的参数
targetEntity=…
,否则对象关系映射器无法准确地确定要为给定接口类型实例化哪个类,例如
RestMethod
。因此,您的映射将是:

@Entity(name = "DataProvider")
public class DataProviderImpl implements DataProvider {
    // ...
    @OneToMany(targetEntity=RestMethodImpl.class, fetch = FetchType.LAZY, mappedBy="dataProvider")
    private List<RestMethod> methods;
我不知道这对您的情况是否有帮助,但当然您应该尝试使用JPA映射器的这些额外信息来调整代码


我刚刚发现了您给定的
persistence.xml
的另一个问题。您应该在同一个
持久化单元
块中拥有这两个类(
DataProviderImpl
RestMethodImpl
),因为从您的配置生成的实体上下文必须了解这两个类,才能实施正确的映射策略

有重复的字段吗?@predrag maric我不知道为什么,但当我尝试your persistence.xml并启动我的项目时,一切都悄无声息地失败了。我的意思是,我有一个不再开始的populator类。我是否应该以某种方式修改blueprint.xml?我每个实体有一个bean…我更改了持久化单元的名称,这会导致问题吗?您应该将其与
blueprint.xml
对齐。不知道为什么它不会产生任何异常,尝试了这两种方法,但第一个修复程序没有进行任何更改(相同的错误)。如果我改变persistence.xml,将两个类放在同一个单元上,我启动我的项目,一切都会悄然失败(我有一个populator类,它没有启动)尝试显式捕获“Throwable”,并打印由此产生的stacktrace。我猜OpenJPA映射器的某些配置不起作用,框架会抛出一些错误或异常,而您的填充程序无法捕获这些错误或异常。第一个(targetEntity=…)修复是必需的,相信我:)-它会导致下一个错误,然而,一个配置错误的persistence.xml首先由mapper框架处理——至少在Hibernate JPA实现中是这样的。还要检查您在项目中使用的包命名是否与您在persistence.xml中指定的包一致——这可能是一个输入错误?最后我得到了它:正确组合您的建议一切顺利:-)
    public interface DataProvider {
    public int getId();
    public void setId(int id);
    public String getName();
    public void setName(String name);
    public List<RestMethod> getMethods();
    public void setMethods(List<RestMethod> methods);
}
    @Entity(name = "RestMethod")
public class RestMethodImpl implements RestMethod {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String nickname;
    // ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="dataProviderId")
    private DataProvider dataProvider;

    public RestMethodImpl() {
        super();
        this.id = 0;
    }

    @Override
    public int getId() {
        return id;
    }
    @Override
    public void setId(int id) {
        this.id = id;
    }
    @Override
    public String getNickname() {
        return nickname;
    }
    @Override
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    @Override
    public DataProvider getDataProvider() {
        return dataProvider;
    }
    @Override
    public void setDataProvider(DataProvider dataProvider) {
        this.dataProvider = dataProvider;
    }
}
    public interface RestMethod  {
    public int getId();
    public void setId(int id);
    public String getNickname();
    public void setNickname(String nickname);
    public DataProvider getDataProvider();
    public void setDataProvider(DataProvider dataProvider);
}
@Entity(name = "DataProvider")
public class DataProviderImpl implements DataProvider {
    // ...
    @OneToMany(targetEntity=RestMethodImpl.class, fetch = FetchType.LAZY, mappedBy="dataProvider")
    private List<RestMethod> methods;
@Entity(name = "RestMethod")
public class RestMethodImpl implements RestMethod {

    // ...  
    @ManyToOne(targetEntity=DataProviderImpl.class, fetch = FetchType.LAZY)
    @JoinColumn(name="dataProviderId")
    private DataProvider dataProvider;