【问题标题】:Blocking Updating or Inserting an Entity when using Cascade in Hibernate在 Hibernate 中使用 Cascade 时阻止更新或插入实体
【发布时间】:2015-06-18 06:59:09
【问题描述】:

我有一个实体 EntHesaplasma ,这个实体与 EntCariHareketler 实体有关系。我在 EntCariHareketler 的 EntHesaplasma 实体中有一个外键。我想设置它们之间的关系,但我不想更新、插入或删除对 EntCariHareketler 实体的操作。只有我想读取第二个实体(EntCariHareketler)的操作。我尝试了 Cascading types ,但我无法成功。

您可以在下面看到我的部分实体

@Entity
@Table(name = "XOZ_HESAPLASMA")
public class EntHesaplasma {

    Integer hesaplasmaid;
    EntCariHareketler carihareket;
    String hesaplasmagrup;

    @Id
    @GeneratedValue
    @Column(name = "hesaplasmaid", unique = true, nullable = false)
    public Integer getHesaplasmaid() {
        return hesaplasmaid;
    }

    public void setHesaplasmaid(Integer hesaplasmaid) {
        this.hesaplasmaid = hesaplasmaid;
    }

    @OneToOne(fetch= FetchType.LAZY)
    @JoinColumn(name="carihareketid")
    public EntCariHareketler getCarihareket() {
        return carihareket;
    }

public void setCarihareket(EntCariHareketler carihareket) {
    this.carihareket = carihareket;
}

@Column(name="hesaplasmagrup")
public String getHesaplasmagrup() {
    return hesaplasmagrup;
}

public void setHesaplasmagrup(String hesaplasmagrup) {
    this.hesaplasmagrup = hesaplasmagrup;
}

这是 EntCarihareketler 实体

@Entity
@Table(name = "CARI_HESAP_HAREKETLERI")
public class EntCariHareketler {

    private Integer cha_RECno;

    @Id
    @GeneratedValue
    @Column(name = "cha_recno", unique = true, nullable = false)
    public Integer getCha_RECno() {
        return cha_RECno;
    }

    public void setCha_RECno(Integer cha_RECno) {
        this.cha_RECno = cha_RECno;
    }

当我想保存 enthesaplasma 对象时,我不想更新或插入 entCariHareketler 实体,我遇到了一个异常,比如 entcarihareketler 实体无法插入。但我不想插入 entcarihareketler 实体。 hibernate 尝试插入该实体,(顺便说一句,在 entcarihareket 实体中,我不使用一些属于主键的字段。我只使用 cha_Recno 作为主键。这是复合主键中的重要字段。)

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;

try {


         EntHesaplasma hesaplasma= new EntHesaplasma();
         hesaplasma.setHesaplasmagrup("a record");
         // related entcarihareketler entity
         EntCariHareketler entCariHareketler= new EntCariHareketler();
         // we set entcarihareketler id (1212) as primary key )
         entCariHareketler.setCha_RECno(1212);

tx=session.beginTransaction();
session.save(hesaplasma); 
tx.commit();

} catch (HibernateException e) {
if (tx != null)tx.rollback();
e.printStackTrace();
} finally {
session.close();
}

【问题讨论】:

  • 我不明白你在问什么。与其告诉我们您不想做什么,不如向我们解释您想做什么,举个例子,展示您的尝试?
  • “但我无法成功”:发生了什么?例外?意外行为?

标签: java hibernate jpa orm hibernate-mapping


【解决方案1】:
  1. 如果你不想修改EntCariHareketler,你可以简单地用@Immutable注释它。

  2. 如果您的实体是可变的,但您想禁用来自另一端的更新,则需要将insertableupdatable @JoinColumn 属性设置为false

    @OneToOne(fetch= FetchType.LAZY)
    @JoinColumn(name="carihareketid", insertable = false, updatable = false)
    public EntCariHareketler getCarihareket() {
        return carihareket;
    }
    

【讨论】:

  • 我尝试了 insertable=false 和 updatable=false,但是它更新了第二个表,但 @immutable 工作并阻止更新。非常感谢您。 :)
  • updatable = false 不应传播 FK 更改,但仍允许更改 EntCariHareketler。如果您不想更改,则需要将 EntCariHareketler 注释为 @Immutable。
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 2011-11-13
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多