首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate:使用1:n关系和backref更新现有实体

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

Stack Overflow用户
提问于 2014-10-22 06:37:03
回答 2查看 538关注 0票数 0

首先:我对hibernate的理解不是很深。我的大部分代码都是试错。我使用Hibernate 4.2.6和注释以及hibernate.cfg.xml,它是下面的Postgres数据库。我没能找到解决办法:

我有一个抽象的超级课程:

代码语言:javascript
复制
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
}

然后是:

代码语言:javascript
复制
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);
    }
}

最后是全班:

代码语言:javascript
复制
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。我已经建立了一个谷仓,并坚持它,也有一个持之以恒的马。现在,我想用以下代码在它们之间创建关系:

代码语言:javascript
复制
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就不会插入到马匹中。所以这不是我要找的解决办法..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-24 07:38:10

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

在谷仓班:

代码语言:javascript
复制
@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);
}

在马术班:

代码语言:javascript
复制
@ManyToOne
@JoinColumn(name = "barn_id")
private Barn barn;

要更新关系,请:

代码语言:javascript
复制
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();
}
票数 0
EN

Stack Overflow用户

发布于 2014-10-22 09:10:28

首先,你错过了referenceColumn的ManyToOne部分吗?我认为叶栅是你想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26501595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档