Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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
Jpa “看见”;referencedColumnNames(ID)。。。未映射到单个属性“;向“添加复合键”后出现1-M关系错误;1“;一边_Jpa_Key_Composite - Fatal编程技术网

Jpa “看见”;referencedColumnNames(ID)。。。未映射到单个属性“;向“添加复合键”后出现1-M关系错误;1“;一边

Jpa “看见”;referencedColumnNames(ID)。。。未映射到单个属性“;向“添加复合键”后出现1-M关系错误;1“;一边,jpa,key,composite,Jpa,Key,Composite,我有一个现有的JPA实体(“引用”),其主键是ID列,它从基类“BaseEntity”(使用超类上的@MappedSuperclass注释)继承 我在一个引用和另一个名为违规的实体之间也有一个1-M关系。违规之前是通过引用实体的“ID”列的外键“REFERENCE_ID”定义的 最近,我尝试向引用实体添加一个不相关的复合键。这不应影响参考和违规之间的1-M关系。但是,当我在tomcat服务器中运行代码时,我看到以下堆栈跟踪: 原因:org.hibernate.AnnotationExceptio

我有一个现有的JPA实体(“引用”),其主键是ID列,它从基类“BaseEntity”(使用超类上的@MappedSuperclass注释)继承

我在一个引用和另一个名为违规的实体之间也有一个1-M关系。违规之前是通过引用实体的“ID”列的外键“REFERENCE_ID”定义的

最近,我尝试向引用实体添加一个不相关的复合键。这不应影响参考和违规之间的1-M关系。但是,当我在tomcat服务器中运行代码时,我看到以下堆栈跟踪:

原因:org.hibernate.AnnotationException:org.qcri.copydetection.sdk.metastore.entity.invalition.reference引用org.qcri.copydetection.sdk.metastore.entity.reference的referencedColumnNames(ID)未映射到单个属性 在org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:205)~[hibernate-annotations-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:110)~[hibernate-annotations-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)~[hibernate-annotations-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)~[hibernate-annotations-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)~[hibernate-annotations-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1206)~[hibernate-core-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1459)~[hibernate-entitymanager-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)~[hibernate-entitymanager-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1086)~[hibernate-entitymanager-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:685)~[hibernate-entitymanager-3.5.6-Final.jar:3.5.6-Final] 在org.hibernate.ejb.HibernatePersistence.createContainerEntityManager工厂(HibernatePersistence.java:73)~[hibernate-entitymanager-3.5.6-Final.jar:3.5.6-Final] 在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE] 在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.AfterPropertieSet(AbstractEntityManagerFactoryBean.java:310)~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] ... 省略39个公共框架

以下是涉及的3个类的代码:

@Entity
@Table(name = "REFERENCE")
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
@IdClass(Reference.ContextualName.class)
public class Reference extends BaseEntity {

@Column(name= "LOCATION", unique=true)
@XmlElement
private String location;

@Id
@AttributeOverrides({
    @AttributeOverride(name = "name", column = @Column(name = "NAME")),
    @AttributeOverride(name = "account", column = @Column(name = "ACCOUNT_ID"))
})

@Column(name = "NAME")
@XmlElement
private String name;

@ManyToOne(optional=false)
@XmlTransient
@JoinColumn(name = "ACCOUNT_ID", referencedColumnName = "ID")
private Account account;


public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}

public Reference() {}

public Reference(String name) {
    setName(name);
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return this.name;
}

public Account getAccount() {
    return this.account;
}

public void setAccount(Account account) {
    this.account = account;
}

@Embeddable
private class ContextualName implements Serializable {
    private static final long serialVersionUID = -3687389984589209378L;

    @Basic(optional = false)
    @Column(name = "NAME")
    @XmlElement
    private String name;

    @ManyToOne(optional=false)
    @XmlTransient
    @JoinColumn(name = "ACCOUNT_ID", referencedColumnName = "ID")
    private Account account;

    ContextualName() {}
}
}

@MappedSuperclass
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
@XmlElement
private Long id;

@Basic(optional = true)
@Column(name = "CREATED", insertable = false, updatable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
@XmlElement
private Date creationDate;

protected BaseEntity() {}

public Long getId() {
    return id;
}

public void setId(Long id) {
    if(this.id==null) {
        this.id = id;
    } else if (this.id!=id) {
        throw new IllegalArgumentException("Cannot change the id after it has been set, as it is a generated field.");
    }
}

public Date getCreationDate() {
    return creationDate;
}

public void setCreationDate(Date creationDate) {
    if(this.creationDate==null) {
        this.creationDate = creationDate;
    } else if (this.creationDate!=creationDate) {
        throw new IllegalArgumentException("Cannot change the creation-date after it has been set, as it is a generated field.");
    }
}
}

@Entity
@Table(name = "VIOLATION")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Violation extends BaseEntity {

@ManyToOne (optional=false, fetch= FetchType.EAGER)
@JoinColumn(name = "REFERENCE_ID", referencedColumnName = "ID")
private Reference reference;

@ManyToOne (optional=false, fetch= FetchType.EAGER)
@JoinColumn(name = "SUSPECT_ID", referencedColumnName = "ID")
private Suspect suspect;

@ManyToOne (optional=false, fetch= FetchType.EAGER)
@XmlTransient
@JoinColumn(name = "SEARCH_ID", referencedColumnName = "ID")
private Search search;

@Basic(optional = false)
@Column(name = "SCORE")
@XmlElement
private double score;

public Violation() {}

public Violation(Search search, Reference ref, Suspect sus, double score) {
    this.search = search;
    this.reference = ref;
    this.suspect = sus;
    this.score = score;
}

public double getScore() {
    return score;
}

public void setScore(double score) {
    this.score = score;
}

public Reference getReference() {
    return reference;
}

public void setReference(Reference reference) {
    this.reference = reference;
}

public Suspect getSuspect() {
    return suspect;
}

public void setSuspect(Suspect suspect) {
    this.suspect = suspect;
}

public Search getSearch() {
    return search;
}

public void setSearch(Search search) {
    if(this.search!=null && this.search!=search) {
        this.search.removeViolation(this);
    }
    this.search = search;
    if(search!=null) {
        if(!search.getViolations().contains(this)) {
            search.addViolation(this);
        }
    }
}
}
长话短说,我完全不知道如何向已经有ID列的现有(遗留)实体添加复合键。我无法删除ID列,也无法更改引用和冲突之间的1-M关系。我一辈子都无法理解错误消息,因为违规实体的“REFERENCE_ID”外键列正在映射到引用实体的单个“ID”列


非常感谢

既然您的引用实体正在扩展已经定义了主键的BaseEntity,并且它使用generation,那么为什么还要让JPA使用复合pk,因为ID将唯一标识引用?在复合pk中使用名称作为引用似乎没有多大价值,JPA会有问题,因为它对主键进行哈希运算-因此,如果将键设置为复合键,则不允许只使用“ID”的外键。实际上,我的目标是基于两个字段的组合在引用实体上强制唯一性:-名称,和-ACCOUNT_ID。换句话说,与同一帐户关联的两个引用实体不能具有相同的名称。同样,如果存在于不同的帐户中,则可以存在两个同名的引用实体。我希望db强制执行这种唯一性,而不是在应用程序级别执行。我认为使用这种类型的复合pk是解决这个问题的方法。也许有另一种方法可以定义JPA中独立于pks的唯一性约束?有人有什么建议吗?:)谢谢