【问题标题】:issue with JPA many to many with extra column in join tableJPA 多对多问题,在连接表中有额外的列
【发布时间】:2014-04-03 17:21:50
【问题描述】:

我正在尝试为连接表中的一个额外列设置多对多关系的 JPA 映射。我的模型如下所示: Hikelist(id), Item(id), ItemList(idList, itItem, quantity)

我的地图:

项目:

@Entity
@Table(name = "T_ITEM")
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    private Collection<Itemlist> setOfItemHikelist = new ArrayList<Itemlist>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.item", cascade=CascadeType.ALL)
    public Collection<Itemlist> getSetOfItemHikelist() {
        return setOfItemHikelist;
    }

    public void setSetOfItemHikelist(Collection<Itemlist> setOfItemHikelist) {
        this.setOfItemHikelist = setOfItemHikelist;
    }
}

项目列表:

@Entity
@Table(name = "T_ITEM_LIST")
@AssociationOverrides({
        @AssociationOverride(name = "pk.item", 
            joinColumns = @JoinColumn(name = "iditem")),
        @AssociationOverride(name = "pk.hikelist", 
            joinColumns = @JoinColumn(name = "idlist")) })
public class Itemlist implements Serializable {

    private ItemListId pk = new ItemListId();

    @EmbeddedId
    public ItemListId getPk() {
        return pk;
    }

    public void setPk(ItemListId pk) {
        this.pk = pk;
    }   

    @Transient
    public Item getItem() {
        return getPk().getItem();
    }

    public void setStock(Item item) {
        getPk().setItem(item);
    }

    @Transient
    public Hikelist getHikelist() {
        return getPk().getHikelist();
    }

    public void setCategory(Hikelist hikelist) {
        getPk().setHikelist(hikelist);
    }

    private String quantity;

    public String getQuantity() {
        return quantity;
    }

    public void setQuantity(String quantity) {
        this.quantity = quantity;
    } 
}

ItemListId:

@Embeddable
public class ItemListId implements java.io.Serializable{

    private Item item;
    private Hikelist hikelist;

    @ManyToOne
    public Item getItem() {
        return item;
    }
    public void setItem(Item item) {
        this.item = item;
    }

    @ManyToOne
    public Hikelist getHikelist() {
        return hikelist;
    }
    public void setHikelist(Hikelist hikelist) {
        this.hikelist = hikelist;
    }
}

我收到这个错误:

原因:org.hibernate.MappingException:无法确定类型 对于:java.util.Collection,在表:T_HIKELIST,对于列: [org.hibernate.mapping.Column(setOfItemHikelist)] 在 org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336) 在 org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:310) 在 org.hibernate.mapping.Property.isValid(Property.java:241) 在 org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:496) 在 org.hibernate.mapping.RootClass.validate(RootClass.java:270) 在 org.hibernate.cfg.Configuration.validate(Configuration.java:1358) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)

如果有人可以帮助我...谢谢!

【问题讨论】:

    标签: hibernate jpa many-to-many


    【解决方案1】:

    我认为您正在混合 AccesType ,在您使用 FIELDS 和 PROPERTIES 中的注释的 Item 类中,请考虑这样做。

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.item", cascade=CascadeType.ALL)
    private Collection<Itemlist> setOfItemHikelist = new ArrayList<Itemlist>();
    
    public Collection<Itemlist> getSetOfItemHikelist() {
        return setOfItemHikelist;
    }
    

    将注释放在字段上,就像在同一类中的 Id 中所做的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多