Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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映射与IdClass-persistence.ArgumentException的多通关系_Java_Exception_Jpa - Fatal编程技术网

Java JPA映射与IdClass-persistence.ArgumentException的多通关系

Java JPA映射与IdClass-persistence.ArgumentException的多通关系,java,exception,jpa,Java,Exception,Jpa,我想用ApacheOpenJPA2.2.0映射两个具有manytone/oneToMay关系的类。 一个类具有两个属性的主键: @Entity(name = "Player") @IdClass(PlayerId.class) public class Player { @Id private String nickname; @Id @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name =

我想用ApacheOpenJPA2.2.0映射两个具有manytone/oneToMay关系的类。 一个类具有两个属性的主键:

@Entity(name = "Player")
@IdClass(PlayerId.class)
public class Player {
    @Id
    private String nickname;
    @Id
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "team_id")
    private Team team;

    public Player() {

    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Team getTeam() {
        return team;
    }

    public void setTeam(Team team) {
        this.team = team;
    }

}

public class PlayerId {
    private String nickname;
    private Team team;

    public PlayerId() {
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Team getTeam() {
        return team;
    }

    public void setTeam(Team team) {
        this.team = team;
    }

    @Override
    public boolean equals(Object o) {
        return ((o instanceof PlayerId) && 
                this.nickname == ((PlayerId)o).getNickname() &&
                this.team == ((PlayerId) o).getTeam());
    }

    public int hashCode() {
        return nickname.hashCode() + team.hashCode();
    }
}

@Entity(name = "Team")
public class Team {
    @Id
    private String name;

    @OneToMany(mappedBy = "team", targetEntity = Player.class, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    private List<Player> players;

    public Team() {

    }

    public List<Player> getPlayers() {
        return players;
    }

    public void setPlayers(List<Player> p) {
        players = p;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@实体(name=“Player”)
@IdClass(PlayerId.class)
公开课选手{
@身份证
私有字符串昵称;
@身份证
@manytone(cascade=CascadeType.PERSIST)
@JoinColumn(name=“团队id”)
私人团队;
公共玩家(){
}
公共字符串get昵称(){
返回昵称;
}
公共无效集合昵称(字符串昵称){
this.昵称=昵称;
}
公共团队getTeam(){
返回队;
}
公共事务组(团队){
这个团队=团队;
}
}
公共类PlayerId{
私有字符串昵称;
私人团队;
公共播放器ID(){
}
公共字符串get昵称(){
返回昵称;
}
公共无效集合昵称(字符串昵称){
this.昵称=昵称;
}
公共团队getTeam(){
返回队;
}
公共事务组(团队){
这个团队=团队;
}
@凌驾
公共布尔等于(对象o){
返回((PlayerId的实例)和
this.nickname==((PlayerId)o).getNickname()&&
this.team==((PlayerId)o.getTeam());
}
公共int hashCode(){
返回昵称.hashCode()+团队.hashCode();
}
}
@实体(名称=“团队”)
公开课小组{
@身份证
私有字符串名称;
@OneToMany(mappedBy=“team”,targetEntity=Player.class,fetch=FetchType.EAGER,cascade=CascadeType.PERSIST)
私人名单玩家;
公共团队(){
}
公共列表getPlayers(){
返回球员;
}
公众玩家(列表p){
玩家=p;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
因此,当我为一支球队创建一名新球员时,我会得到以下例外情况:

Exception in thread "main" <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.persistence.ArgumentException: Errors encountered while resolving metadata.  See nested exceptions for details.
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:668)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
    at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:714)
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:643)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
    at org.apache.openjpa.jdbc.meta.MappingRepository.getMapping(MappingRepository.java:355)
    at org.apache.openjpa.jdbc.meta.MappingTool.getMapping(MappingTool.java:682)
    at org.apache.openjpa.jdbc.meta.MappingTool.buildSchema(MappingTool.java:754)
    at org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:652)
    at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:154)
    at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:164)
    at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:122)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:209)
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
    at main.Main.main(Main.java:27)
Caused by: <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.persistence.ArgumentException: The id class specified by type "class model.Player" does not match the primary key fields of the class.  Make sure your identity class has the same primary keys as your persistent type, including pk field types. Mismatched property: "team"
    at org.apache.openjpa.meta.ClassMetaData.validateAppIdClassPKs(ClassMetaData.java:2216)
    at org.apache.openjpa.meta.ClassMetaData.validateAppIdClass(ClassMetaData.java:2090)
    at org.apache.openjpa.meta.ClassMetaData.validateIdentity(ClassMetaData.java:2026)
    at org.apache.openjpa.meta.ClassMetaData.validateMeta(ClassMetaData.java:1938)
    at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1799)
    at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:822)
    at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:719)
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:643)
    ... 19 more
NestedThrowables:
<openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.persistence.ArgumentException: Attempt to map "model.Player.team" failed: the owning entity is not mapped.
    at org.apache.openjpa.jdbc.meta.MappingInfo.assertTable(MappingInfo.java:628)
    at org.apache.openjpa.jdbc.meta.MappingInfo.createForeignKey(MappingInfo.java:1079)
    at org.apache.openjpa.jdbc.meta.ValueMappingInfo.getTypeJoin(ValueMappingInfo.java:115)
    at org.apache.openjpa.jdbc.meta.ValueMappingInfo.getTypeJoin(ValueMappingInfo.java:92)
    at org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.map(RelationFieldStrategy.java:167)
    at org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:146)
    at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:82)
    at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:496)
    at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:461)
    at org.apache.openjpa.jdbc.meta.strats.RelationToManyInverseKeyFieldStrategy.map(RelationToManyInverseKeyFieldStrategy.java:135)
    at org.apache.openjpa.jdbc.meta.strats.RelationCollectionInverseKeyFieldStrategy.map(RelationCollectionInverseKeyFieldStrategy.java:95)
    at org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:146)
    at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:82)
    at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:496)
    at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:461)
    at org.apache.openjpa.jdbc.meta.ClassMapping.resolveMapping(ClassMapping.java:854)
    at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1802)
    at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:822)
    at org.apache.openjpa.meta.MetaDataRepository.resolveMapping(MetaDataRepository.java:777)
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:657)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
    at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:714)
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:643)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
    at org.apache.openjpa.jdbc.meta.MappingRepository.getMapping(MappingRepository.java:355)
    at org.apache.openjpa.jdbc.meta.MappingTool.getMapping(MappingTool.java:682)
    at org.apache.openjpa.jdbc.meta.MappingTool.buildSchema(MappingTool.java:754)
    at org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:652)
    at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:154)
    at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:164)
    at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:122)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:209)
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
    at main.Main.main(Main.java:27)
线程“main”org.apache.openjpa.persistence.ArgumentException中的异常:解析元数据时遇到错误。有关详细信息,请参见嵌套异常。 位于org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:668) 位于org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411) 位于org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384) 位于org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:714) 位于org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:643) 位于org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411) 位于org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384) 位于org.apache.openjpa.jdbc.meta.MappingRepository.getMapping(MappingRepository.java:355) 位于org.apache.openjpa.jdbc.meta.MappingTool.getMapping(MappingTool.java:682) 位于org.apache.openjpa.jdbc.meta.MappingTool.buildSchema(MappingTool.java:754) 位于org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:652) 位于org.apache.openjpa.jdbc.kernel.jdbbrokerfactory.synchronizeMappings(jdbbrokerfactory.java:154) 位于org.apache.openjpa.jdbc.kernel.jdbbrokerfactory.synchronizeMappings(jdbbrokerfactory.java:164) 位于org.apache.openjpa.jdbc.kernel.jdbbrokerfactory.newBrokerImpl(jdbbrokerfactory.java:122) 位于org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:209) 位于org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156) 位于org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227) 位于org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154) 位于org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60) main.main.main(main.java:27) 原因:org.apache.openjpa.persistence.ArgumentException:类型“class model.Player”指定的id类与该类的主键字段不匹配。确保您的标识类具有与持久类型相同的主键,包括pk字段类型。不匹配的属性:“团队” 位于org.apache.openjpa.meta.ClassMetaData.validateAppIdClassPKs(ClassMetaData.java:2216) 位于org.apache.openjpa.meta.ClassMetaData.validateAppIdClass(ClassMetaData.java:2090) 位于org.apache.openjpa.meta.ClassMetaData.validateIdentity(ClassMetaData.java:2026) 位于org.apache.openjpa.meta.ClassMetaData.validateMeta(ClassMetaData.java:1938) 位于org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1799) 位于org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:822) 位于org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:719) 位于org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:643) ... 还有19个 嵌套的工作流表: org.apache.openjpa.persistence.ArgumentException:尝试映射“model.Player.team”失败:未映射所属实体。 位于org.apache.openjpa.jdbc.meta.MappingInfo.assertTable(MappingInfo.java:628) 位于org.apache.openjpa.jdbc.meta.MappingInfo.createForeignKey(MappingInfo.java:1079) 位于org.apache.openjpa.jdbc.meta.ValueMappingInfo.getTypeJoin(ValueMappingInfo.java:115) 位于org.apache.openjpa.jdbc.meta.ValueMappingInfo.getTypeJoin(ValueMappingInfo.java:92) 位于org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.map(RelationFieldStrategy.java:167) 位于org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:146) 位于org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:82) 位于org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:496) 位于org.apache.openjpa.jdbc.meta。
public class PlayerId {
    private String nickname;
    private Team team;  -> this should be "name" to match the Id in the class Team.

...

}
@Entity
class User {
  @EmbeddedId
  @AttributeOverride(name="firstName", column=@Column(name="fld_firstname")
  UserId id;

  Integer age;
}

@Embeddable
class UserId implements Serializable {
  String firstName;
  String lastName;
}
public class PlayerId {
   private String nickname;
   private String team;

   ...
}