Orm 读取EBean中具有复合键的批注时出错
此后 我想使用OneToMany而不是ManyToMany注释,让中产阶级使用Ebean使用复合键。我有一个错误: java.lang.RuntimeException:读取models.SoftwareTagPk的注释时出错 这是我的SoftwareTagPk类: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
@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;
}
}