Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/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
Orm 读取EBean中具有复合键的批注时出错_Orm_Ebean_Composite Key - Fatal编程技术网

Orm 读取EBean中具有复合键的批注时出错

Orm 读取EBean中具有复合键的批注时出错,orm,ebean,composite-key,Orm,Ebean,Composite Key,此后 我想使用OneToMany而不是ManyToMany注释,让中产阶级使用Ebean使用复合键。我有一个错误: java.lang.RuntimeException:读取models.SoftwareTagPk的注释时出错 这是我的SoftwareTagPk类: @Embeddable public class SoftwareTagPk implements Serializable { @ManyToOne private Tag tag; @ManyToO

此后

我想使用OneToMany而不是ManyToMany注释,让中产阶级使用Ebean使用复合键。我有一个错误:

java.lang.RuntimeException:读取models.SoftwareTagPk的注释时出错

这是我的SoftwareTagPk类:

@Embeddable
public class SoftwareTagPk  implements Serializable {

    @ManyToOne
    private Tag tag;

    @ManyToOne
    private Software software;

    ...
}
和SoftwareTag类:

@Entity
public class SoftwareTag extends Model {

    @EmbeddedId
    private SoftwareTagPk pk = new SoftwareTagPk();

    @Transient
    public Tag getTag() {
        return pk.getTag();
    }

    public void setTag(Tag aTag) {
        pk.setTag(aTag);
    }

    @Transient
    public Software getSoftware() {
        return pk.getSoftware();
    }

    public void setSoftware(Software aSoftware) {
        pk.setSoftware(aSoftware);
    } 
}
也在日志中:

与来自的[class models.Tag]关联时出错 [models.SoftwareTagPk.tag]。类模型.标记是否已注册


如何修复它?

要使此代码正常工作,您必须执行以下操作:

  • 在您的
    SoftwareTagPk
    类中,仅放置标签和软件的id
  • @ManyToOne
    关系移动到
    SoftwareTag
  • 添加属性
    可更新的
    可插入的
    设置为false的
    @JoinColumn
    注释
  • 覆盖
    SoftwareTag
    类中的设置器
    setTag
    setSoftware
    。在这些设置程序中,您将把id重写为复合密钥
  • 该解决方案的主要思想是,
    SoftwareTag
    具有复合密钥和
    @manytone
    关系,并且它们被映射到相同的collumns

    代码如下:

    Tag.java

    @Entity 
    public class Tag extends Model {
        @Id
        private Integer id;
    
        @OneToMany(mappedBy="tag")
        public List<SoftwareTag> softwareTags;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer aId) {
            id=aId;
        }
    
        public static Finder<Integer,Tag> find = new Finder<Integer,Tag>(
            Integer.class, Tag.class
        ); 
    } 
    
    SoftwareTagPk.java

    @Embeddable
    public class SoftwareTagPk implements Serializable {
    
        public Integer tag_id;
    
        public Integer software_id;
    
        @Override
        public int hashCode() {
            return tag_id + software_id;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) 
                return true;
            SoftwareTagPk pk = (SoftwareTagPk)obj;
            if(pk == null)
                return false;
            if (pk.tag_id.equals(tag_id) && pk.software_id.equals(software_id)) {
                return true;
            }
            return false;
        }
    }
    
    @Entity
    public class SoftwareTag extends Model {
    
        SoftwareTag() {
            pk = new SoftwareTagPk();       
        }
    
        @EmbeddedId
        private SoftwareTagPk pk = new SoftwareTagPk();
    
        @ManyToOne
        @JoinColumn(name = "tag_id", insertable = false, updatable = false)
        private Tag tag;
    
        @ManyToOne
        @JoinColumn(name = "software_id", insertable = false, updatable = false)
        private Software software;
    
        public Tag getTag() {
            return tag;
        }
    
        public void setTag(Tag aTag) {
            tag = aTag;
            pk.tag_id = aTag.getId();
        }
    
        public Software getSoftware() {
            return software;
        }
    
        public void setSoftware(Software aSoftware) {
            software = aSoftware;
            pk.software_id = aSoftware.getId();
        }
    }
    
    @Embeddable
    public class SoftwareTagPk implements Serializable {
    
        public Integer tag_id;
    
        public Integer software_id;
    
        @Override
        public int hashCode() {
            return tag_id + software_id;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) 
                return true;
            SoftwareTagPk pk = (SoftwareTagPk)obj;
            if(pk == null)
                return false;
            if (pk.tag_id.equals(tag_id) && pk.software_id.equals(software_id)) {
                return true;
            }
            return false;
        }
    }