Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 Hibernate通过联接表映射复合键错误_Java_Hibernate_Jpa_Many To Many - Fatal编程技术网

Java 多对多JPA Hibernate通过联接表映射复合键错误

Java 多对多JPA Hibernate通过联接表映射复合键错误,java,hibernate,jpa,many-to-many,Java,Hibernate,Jpa,Many To Many,我有以下两个类(以及它们的pk类)和这些注释。我删除了setters/getter/hashcode/equals来压缩示例 我最终得到了这个错误 org.hibernate.MappingException:集合映射中的重复列:com.stackOverflow.Features.thingCategory列:年份 我的猜测是,因为“年”是在联接表中共享的,所以我弄乱了一些关联实体的语法。请注意,这些视图的实体之间存在隐式关系,我正试图在注释中对其建模。我尝试了一些JPA建模工具,这些工具在建

我有以下两个类(以及它们的pk类)和这些注释。我删除了setters/getter/hashcode/equals来压缩示例

我最终得到了这个错误

org.hibernate.MappingException:集合映射中的重复列:com.stackOverflow.Features.thingCategory列:年份

我的猜测是,因为“年”是在联接表中共享的,所以我弄乱了一些关联实体的语法。请注意,这些视图的实体之间存在隐式关系,我正试图在注释中对其建模。我尝试了一些JPA建模工具,这些工具在建模后给了我同样的错误。我已尝试将联接列设置为
insertable
,并将
updateable
设置为
false

我当然可以只编写一个SQL查询,但我真的很惊讶在Hibernate中这对我来说是多么困难

特征实体

@Entity
@Table(name = "myTableOfFeatures")
public class Feature {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private FeatureKey id;

    @Column(name="displayText")
    private String description;

    //bi-directional many-to-many association
    @ManyToMany
    @JoinTable(
            name="joinTableToThingCategories"
            , joinColumns={
            @JoinColumn(name="name", referencedColumnName="name", insertable = false, updatable = false),
            @JoinColumn(name="year", referencedColumnName="year", insertable = false, updatable = false)
    }
            , inverseJoinColumns={
            @JoinColumn(name="year", referencedColumnName="year", insertable = false, updatable = false),
            @JoinColumn(name="title", referencedColumnName="title", insertable = false, updatable = false)
    }
    )
    private List<ThingCategory> thingCategory;

    public Feature() {
    } 
    // ... gets and sets

} 
@Embeddable
public class FeatureKey implements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @Column(name="name")
    private String myName;

    private String year;

    public FeatureKey() {
    }
    // ... gets and sets and equals and hashes
}
@实体
@表(name=“MyTableOffatures”)
公共类功能{
私有静态最终长serialVersionUID=1L;
@嵌入ID
私有特征密钥id;
@列(name=“displayText”)
私有字符串描述;
//双向多对多关联
@许多
@可接合(
name=“joinTableToThingCategories”
,连接柱={
@JoinColumn(name=“name”,referencedColumnName=“name”,insertable=false,updateable=false),
@JoinColumn(name=“year”,referencedColumnName=“year”,insertable=false,updateable=false)
}
,反向连接列={
@JoinColumn(name=“year”,referencedColumnName=“year”,insertable=false,updateable=false),
@JoinColumn(name=“title”,referencedColumnName=“title”,insertable=false,updateable=false)
}
)
私人物品目录;
公共特写(){
} 
//…得到和设置
} 
@可嵌入
公共类FeatureKey实现可序列化{
//可序列化类所需的默认串行版本id。
私有静态最终长serialVersionUID=1L;
@列(name=“name”)
私有字符串myName;
私人弦年;
公共特性密钥(){
}
//…获取、设置、等于和散列
}
物类实体

@Entity
@Table(name = "CategoriesOfThings")
public class ThingCategory implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private ThingCategoryKey id;

    private String comment;

    //bi-directional many-to-many association to categories
    @ManyToMany(mappedBy="thingCategory")
    private List<Feature> features;

    public ThingCategory() {
    }
    // ... gets and sets
}
@Embeddable
public class ThingCategoryKey implements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    private String year;

    @Column(name="categoryName")
    private String title;

    public ThingCategoryKey() {
    }
    // ... gets and sets and equals and hashes
}
@实体
@表(name=“CategoriesOfThings”)
公共类ThingCategory实现可序列化{
私有静态最终长serialVersionUID=1L;
@嵌入ID
私人物品类别的id;
私有字符串注释;
//类别的双向多对多关联
@许多(mappedBy=“thingCategory”)
私有列表功能;
公共物品类别(){
}
//…得到和设置
}
@可嵌入
公共类ThingCategoryKey实现可序列化{
//可序列化类所需的默认串行版本id。
私有静态最终长serialVersionUID=1L;
私人弦年;
@列(name=“categoryName”)
私有字符串标题;
公共事物分类{
}
//…获取、设置、等于和散列
}

这是JPA2.1规范中的一个示例。 我希望有帮助

@Entity
public class Employee {
    @Id int id;
    @Embedded ContactInfo contactInfo;
    ...
}


@Embeddable
public class ContactInfo {
    @ManyToOne Address address; // Unidirectional
    @ManyToMany List<PhoneNumber> phoneNumbers; // Bidirectional 
}

@Entity
public class PhoneNumber {
    @Id int phNumber; 

    @ManyToMany(mappedBy="contactInfo.phoneNumbers")         
    Collection<Employee> employees;
}
@实体
公营雇员{
@Id-int-Id;
@嵌入式ContactInfo ContactInfo;
...
}
@可嵌入
公共类联系人信息{
@多通地址;//单向
@多个列表电话号码;//双向
}
@实体
公共类电话号码{
@Id-int-phNumber;
@ManyToMany(mappedBy=“contactInfo.phoneNumbers”)
收集员工;
}

我强烈推荐您使用此规格

这是JPA2.1规范中的一个示例。 我希望有帮助

@Entity
public class Employee {
    @Id int id;
    @Embedded ContactInfo contactInfo;
    ...
}


@Embeddable
public class ContactInfo {
    @ManyToOne Address address; // Unidirectional
    @ManyToMany List<PhoneNumber> phoneNumbers; // Bidirectional 
}

@Entity
public class PhoneNumber {
    @Id int phNumber; 

    @ManyToMany(mappedBy="contactInfo.phoneNumbers")         
    Collection<Employee> employees;
}
@实体
公营雇员{
@Id-int-Id;
@嵌入式ContactInfo ContactInfo;
...
}
@可嵌入
公共类联系人信息{
@多通地址;//单向
@多个列表电话号码;//双向
}
@实体
公共类电话号码{
@Id-int-phNumber;
@ManyToMany(mappedBy=“contactInfo.phoneNumbers”)
收集员工;
}

我强烈推荐您使用此规格

这可能行得通,但我自己还没试过;所以我想把它写成注释,但把代码写成注释是很麻烦的。因此,如果它有效的话,你可能会想尝试一下(抱歉,没有时间尝试)。如果它不起作用,请给我留言,我会删除它

@JoinTable(
        name="joinTableToThingCategories", 
        joinColumns={
            @JoinColumn(name="feature_name", referencedColumnName="name", insertable = false, updatable = false),
            @JoinColumn(name="feature_year", referencedColumnName="year", insertable = false, updatable = false)
        }, 
        inverseJoinColumns={
            @JoinColumn(name="tcat_year", referencedColumnName="year", insertable = false, updatable = false),
            @JoinColumn(name="tcat_title", referencedColumnName="title", insertable = false, updatable = false)
       }
)
private List<ThingCategory> thingCategory;
@JoinTable(
name=“joinTableToThingCategories”,
连接柱={
@JoinColumn(name=“feature\u name”,referencedColumnName=“name”,insertable=false,updateable=false),
@JoinColumn(name=“feature\u year”,referencedColumnName=“year”,insertable=false,updateable=false)
}, 
反向连接柱={
@JoinColumn(name=“tcat_year”,referencedColumnName=“year”,insertable=false,updateable=false),
@JoinColumn(name=“tcat\u title”,referencedColumnName=“title”,insertable=false,updateable=false)
}
)
私人物品目录;

这可能行得通,但我自己还没试过;所以我想把它写成注释,但把代码写成注释是很麻烦的。因此,如果它有效的话,你可能会想尝试一下(抱歉,没有时间尝试)。如果它不起作用,请给我留言,我会删除它

@JoinTable(
        name="joinTableToThingCategories", 
        joinColumns={
            @JoinColumn(name="feature_name", referencedColumnName="name", insertable = false, updatable = false),
            @JoinColumn(name="feature_year", referencedColumnName="year", insertable = false, updatable = false)
        }, 
        inverseJoinColumns={
            @JoinColumn(name="tcat_year", referencedColumnName="year", insertable = false, updatable = false),
            @JoinColumn(name="tcat_title", referencedColumnName="title", insertable = false, updatable = false)
       }
)
private List<ThingCategory> thingCategory;
@JoinTable(
name=“joinTableToThingCategories”,
连接柱={
@JoinColumn(name=“feature\u name”,referencedColumnName=“name”,insertable=false,updateable=false),
@JoinColumn(name=“feature\u year”,referencedColumnName=“year”,insertable=false,updateable=false)
}, 
反向连接柱={
@JoinColumn(name=“tcat_year”,referencedColumnName=“year”,insertable=false,updateable=false),
@JoinColumn(name=“tcat\u title”,referencedColumnName=“title”,insertable=false,updateable=false)
}
)
私人物品目录;

我不确定它是否能用。你可以