2013-03-24 63 views
1

在此之後link錯誤讀取註解複合鍵EBean

我想用一對多而是多對多註釋,用起來使用Ebean在複合鍵中產階級。我有這樣的錯誤:

java.lang.RuntimeException: Error reading annotations for 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); 
    } 
} 

此外,在日誌中:

Error with association to [class models.Tag] from [models.SoftwareTagPk.tag]. Is class models.Tag registered?

如何解決它?

+0

https://github.com/playframework/Play20/pull/724 – ses 2013-03-24 02:51:22

回答

2

爲了讓你不得不這樣做編碼工作:

  1. 在你SoftwareTagPk類把標籤和軟件的唯一ID的
  2. 移動@ManyToOne關係SoftwareTag
  3. 添加@JoinColumn註釋與屬性updatableinsertable設置爲false。
  4. 覆寫設置器setTagsetSoftwareSoftwareTag類。在這些setter中,你將重寫id到組合鍵。該解決方案的

主要思想是:SoftwareTag具有複合鍵和@ManyToOne關係,它們映射到同一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 
    ); 
} 

Software.java

@Entity 
public class Software extends Model { 
    @Id 
    private Integer id; 

    @OneToMany(mappedBy="software") 
    public List<SoftwareTag> softwareTags; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer aId) { 
     id=aId; 
    } 
} 

SoftwareTag.java

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

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