首先:我对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);
}
}最后是全班:
import java.util.ArrayList;
import java.utils.List;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Horse extends AbstractEntity {
//...
@ManyToOne
@JoinColumn(name = "barn_id")
private Barn barn;
// other stuff and getters and setters
}Hibernate为马创建一个表(带有谷仓的外键)、谷仓,然后创建带有ids的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表中获得想要的条目,但是在entity中,我将不会插入谷仓的id。从谷仓我可以得到它的马。但是,由于我使用马厩作为后援,我想我需要' mappedBy ',因为我希望谷仓可以通过马匹进入,而且没有mappedBy,谷仓的id就不会插入到马匹中。所以这不是我要找的解决办法..。
发布于 2014-10-24 07:38:10
我终于拿到了!我就是这样做的:
在谷仓班:
@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);
}在马术班:
@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();
}发布于 2014-10-22 09:10:28
首先,你错过了referenceColumn的ManyToOne部分吗?我认为叶栅是你想要的。
https://stackoverflow.com/questions/26501595
复制相似问题