Java Hibernate:使用1:n关系和backref更新现有实体

Java Hibernate:使用1:n关系和backref更新现有实体,java,hibernate,postgresql,Java,Hibernate,Postgresql,首先:我对hibernate的理解不是很深刻。我的大部分代码都是反复试验的。我正在使用Hibernate 4.2.6和注释以及Hibernate.cfg.xml,它下面是一个Postgres数据库。 我无法找到解决此问题的方法: 我有一个抽象的超类: import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @MappedSupe

首先:我对hibernate的理解不是很深刻。我的大部分代码都是反复试验的。我正在使用Hibernate 4.2.6和注释以及Hibernate.cfg.xml,它下面是一个Postgres数据库。 我无法找到解决此问题的方法:

我有一个抽象的超类:

import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractEntity {
    @Id
    @GeneratedValue
    private Long id;

    //getter and setter
}
其次是:

import java.util.ArrayList;
import java.utils.List;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

@Entity
public class Barn extends AbstractEntity {
    //...
    @OneToMany(mappedBy = "barn", fetch = FetchType.EAGER)
    private List<Horse> horses = new ArrayList<>();
    //other stuff and getters and setters

    public void addHorseToBarn(Horse horse) {
        horse.setBarn(this);
        this.horses.add(horse);
    }
}
Hibernate为horse创建一个表,外键为barn,barn,然后是带有ID的barn_horse。 我已经建立了一个谷仓,并坚持它,还有一个分散的马。 现在,我想用以下代码在他们两人之间创建关系:

public void takeHorseIntoBarn(Barn barn, Horse horse) {
    Session session = sessionFactory.openSession();
    try {
        session.beginTransaction();
        Barn b = (Barn) session.load(Barn.class, barn.getId());
        Horse h = (Horse) session.load(Horse.class, horse.getId());
        b.addHorseToBarn(h);
        session.update(h);
        session.update(b);
        session.getTransaction().commit();
    } catch(Exception e) {
        session.getTransaction().rollback();
    } finally {
        session.close();
    }
}
在控制台中,我只看到更新马的输出。当我事后查看我的数据库时,barn_horse中没有条目。桌上的马没有谷仓的钥匙。 我已经尝试了很多方法,如果我没有阅读和尝试很多东西,我不会在这里问。那么,你知道问题出在哪里吗?谢谢

更新:
到目前为止,我发现:如果我删除mappedBy并向Barn添加Cascade.ALL,我将在Barn_horses表中获得想要的条目,但在实体Horse中,我不会获得插入的Barn的id。从谷仓里,我可以得到它的马。但由于我使用马的谷仓作为背景参考,我想我需要“mappedBy”,因为我希望谷仓可以通过马访问,并且没有mappedBy,谷仓的id不会插入马中。所以这不是我要寻找的解决方案…

首先,你在许多部分缺少引用列?
我想这就是你想要的。

我终于得到了!我就是这样做的:

谷仓级:

@OneToMany(mappedBy = "barn", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Horse> horses = new ArrayList<>();

public void addHorse(Horse horse) {
    this.horses.add(horse);
    horse.setBarn(this);
}
要更新关系,请执行以下操作:

Session session = sessionFactory.openSession();
try {
    session.beginTransaction();
    Barn b = (Barn) session.load(Barn.class, barn.getId());
    Horse h = (Horse) session.load(Horse.class, horse.getId());
    b.addHorse(h);
    session.update(b);
    session.update(h);
    session.getTransaction().commit();
} catch(Exception e) {
    session.getTransaction().rollback();
} finally {
    session.close();
}

参考列在多通中?我不明白你要我做什么。就我对级联的理解而言,我认为通过对这两个实体进行更新,我不需要d级联。在我的尝试中,我使用了cascade.all,但都没有用。
@ManyToOne
@JoinColumn(name = "barn_id")
private Barn barn;
Session session = sessionFactory.openSession();
try {
    session.beginTransaction();
    Barn b = (Barn) session.load(Barn.class, barn.getId());
    Horse h = (Horse) session.load(Horse.class, horse.getId());
    b.addHorse(h);
    session.update(b);
    session.update(h);
    session.getTransaction().commit();
} catch(Exception e) {
    session.getTransaction().rollback();
} finally {
    session.close();
}