Java Hibernate:使用1:n关系和backref更新现有实体
首先:我对hibernate的理解不是很深刻。我的大部分代码都是反复试验的。我正在使用Hibernate 4.2.6和注释以及Hibernate.cfg.xml,它下面是一个Postgres数据库。 我无法找到解决此问题的方法: 我有一个抽象的超类: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
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();
}