Java 带有额外列的多对多Hibernate映射

Java 带有额外列的多对多Hibernate映射,java,hibernate,many-to-many,model-associations,Java,Hibernate,Many To Many,Model Associations,这个问题我在这里已经见过好几次了,但是没有一个答案能解决我的问题 我试图解构多对多关系,将多对一和一对多实体分开,这样我就可以添加额外的列。据我所知,主实体保存到数据库中,但中间实体没有。如果有人能弄清楚发生了什么,我将非常感激。我尝试用主键组合(aka:@AssociationOverride)的另一种方法来实现这一点,但它也不起作用。我在网上搜索过,但在这里找不到我的问题的答案 这是我的主要实体MaintOrder: @Entity @Table(name="maint_orders") p

这个问题我在这里已经见过好几次了,但是没有一个答案能解决我的问题

我试图解构多对多关系,将多对一和一对多实体分开,这样我就可以添加额外的列。据我所知,主实体保存到数据库中,但中间实体没有。如果有人能弄清楚发生了什么,我将非常感激。我尝试用主键组合(aka:@AssociationOverride)的另一种方法来实现这一点,但它也不起作用。我在网上搜索过,但在这里找不到我的问题的答案

这是我的主要实体MaintOrder:

@Entity
@Table(name="maint_orders")
public class MaintOrder extends PersistedObject implements java.io.Serializable {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy="maintOrder")
private Set<ManPowerLine> manPower = new HashSet<ManPowerLine>() ;

public void addManPower(ManPower manPower, Integer quantity, Float price) {
  ManPowerLine mpLine = new ManPowerLine();
  mpLine.setManPower(manPower);
  mpLine.setMaintOrder(this);
  mpLine.setManPowerID(manPower.getManPowerID());
  mpLine.setMaintOrderID(this.getMaintOrderID());
  mpLine.setQuantity(quantity);
  mpLine.setPrice(price);
  this.manPower.add(mpLine);
    // Also add the association object to the employee.
  manPower.getMaintOrder().add(mpLine);
  }
... getters and setters
}
和我的ID实体ManPowerLineID:

public class ManPowerLineID implements java.io.Serializable {

private Long maintOrderID;
private Long manPowerID;

public Long getMaintOrderID(){
    return maintOrderID;
}
public Long getManPowerID(){
    return manPowerID;
}
public void setMaintOrderID(Long maintOrderID){
    this.maintOrderID = maintOrderID;
}
public void setManPowerID(Long manPowerID){
    this.manPowerID = manPowerID;
}


@Override
public int hashCode(){
    return (int)(maintOrderID + manPowerID);
}

@Override   
public boolean equals(Object obj) {

    if( obj instanceof ManPowerLine){
        ManPowerLineID otherID = (ManPowerLineID)obj;
        boolean hey = (otherID.maintOrderID == this.maintOrderID) && (otherID.manPowerID ==  this.manPowerID);
        return hey;
    }
        return false;

}

}
最后,利用此功能的代码如下所示:

private void insertObject(  ) {

ServiceLocator locator = new ServiceLocator();
SessionFactory sf = locator.getHibernateSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();

MaintOrder m = new MaintOrder();

... various setters to m

Set manPowerSet = new HashSet();
for(int i = 0; i < manPowerSet.size(); i++){
ManPower mp = new ManPower();
mp = (ManPower) manPowerSet.iterator().next();
m.addManPower(mp, quantity, cost);
}
sess.saveOrUpdate(m);
tx.commit();
sess.close();

}
private void insertObject(){
ServiceLocator定位器=新ServiceLocator();
SessionFactory sf=locator.getHibernateSessionFactory();
Session sess=sf.openSession();
事务tx=sess.beginTransaction();
MaintOrder m=新MaintOrder();
…各种二传手
Set manPowerSet=new HashSet();
对于(int i=0;i
我是否需要使用更多的m.addManPower来添加到生产线?我已尝试添加m.setManPowerLine,但它不会改变结果


无论如何,我知道有很多代码要看,但提前谢谢。

结果我解决了这个问题。问题是我没有在所有正确的地方设置cascade=CascadeType.ALL。具体而言:

@OneToMany(mappedBy="manPower", fetch = FetchType.EAGER)
private List<ManPowerLine> maintOrder = new ArrayList<ManPowerLine>();
@OneToMany(mappedBy=“manPower”,fetch=FetchType.EAGER)
private List maintOrder=new ArrayList();
应该是:

@OneToMany(mappedBy="manPower", cascade = CascadeType.All)
private List<ManPowerLine> maintOrder = new ArrayList<ManPowerLine>();
@OneToMany(mappedBy=“manPower”,cascade=CascadeType.All)
private List maintOrder=new ArrayList();
@OneToMany(mappedBy="manPower", fetch = FetchType.EAGER)
private List<ManPowerLine> maintOrder = new ArrayList<ManPowerLine>();
@OneToMany(mappedBy="manPower", cascade = CascadeType.All)
private List<ManPowerLine> maintOrder = new ArrayList<ManPowerLine>();