【问题标题】:Hibernate: How to join a table with a column which is not a foreign keyHibernate:如何使用不是外键的列连接表
【发布时间】:2018-01-08 00:32:00
【问题描述】:

我正在尝试使用 tartikel 中的主键 kArtikel 在 tartikel 和 teigenschaft 之间创建 OneToOne 关系。 TArtikelEntity中的代码sn-p:

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "kArtikel", referencedColumnName="kArtikel")
public TeigenschaftEntity getTeigenschaftEntity() {
    return teigenschaftEntity;
}

public void setTeigenschaftEntity(TeigenschaftEntity teigenschaftEntity) {
    this.teigenschaftEntity = teigenschaftEntity;
}

teigenschaft 的完整实体:

@Entity
@Table(name = "teigenschaft", schema = "dbo", catalog = "Mandant_EinsZwei")
public class TeigenschaftEntity {

private int kEigenschaft;
private int kArtikel;
private String cWaehlbar;
private Integer nSort;
private String cTyp;
private String cAktiv;

@Id
@Column(name = "kEigenschaft")
public int getkEigenschaft() {
    return kEigenschaft;
}

public void setkEigenschaft(int kEigenschaft) {
    this.kEigenschaft = kEigenschaft;
}

@Basic
@Column(name = "kArtikel")
public int getkArtikel() {
    return kArtikel;
}

public void setkArtikel(int kArtikel) {
    this.kArtikel = kArtikel;
}

@Basic
@Column(name = "cWaehlbar")
public String getcWaehlbar() {
    return cWaehlbar;
}

public void setcWaehlbar(String cWaehlbar) {
    this.cWaehlbar = cWaehlbar;
}

@Basic
@Column(name = "nSort")
public Integer getnSort() {
    return nSort;
}

public void setnSort(Integer nSort) {
    this.nSort = nSort;
}

@Basic
@Column(name = "cTyp")
public String getcTyp() {
    return cTyp;
}

public void setcTyp(String cTyp) {
    this.cTyp = cTyp;
}

@Basic
@Column(name = "cAktiv")
public String getcAktiv() {
    return cAktiv;
}

public void setcAktiv(String cAktiv) {
    this.cAktiv = cAktiv;
}

}

这是我得到 NullPointerException 的地方(第 4 行):

session.beginTransaction();
TArtikelEntity tArtikelEntity = session.get(TArtikelEntity.class, 189820);
System.out.println(tArtikelEntity.toString());
System.out.println(tArtikelEntity.getTeigenschaftEntity().getkEigenschaft()+" <---- kEigenschaft");
session.getTransaction().commit();

我在第二个查询中找到了问题。不是使用 kArtikel 而是使用 kEigenschaft(teigenschaft 的主键):

select teigenscha0_.kEigenschaft as kEigensc1_12_0_, teigenscha0_.cAktiv as cAktiv2_12_0_, teigenscha0_.cTyp as cTyp3_12_0_, teigenscha0_.cWaehlbar as cWaehlba4_12_0_, teigenscha0_.kArtikel as kArtikel5_12_0_, teigenscha0_.nSort as nSort6_12_0_ from Mandant_EinsZwei.dbo.teigenschaft teigenscha0_ where teigenscha0_.kEigenschaft=?|select teigenscha0_.kEigenschaft as kEigensc1_12_0_, teigenscha0_.cAktiv as cAktiv2_12_0_, teigenscha0_.cTyp as cTyp3_12_0_, teigenscha0_.cWaehlbar as cWaehlba4_12_0_, teigenscha0_.kArtikel as kArtikel5_12_0_, teigenscha0_.nSort as nSort6_12_0_ from Mandant_EinsZwei.dbo.teigenschaft teigenscha0_ where teigenscha0_.kEigenschaft=189820

但这怎么可能呢?我向 kArtikel 提到了 TArtikelEntity 中的 JoinColumn。为什么不使用 kArtikel 而是使用 kEigenschaft?

【问题讨论】:

    标签: java sql-server database hibernate


    【解决方案1】:

    空指针异常不是由于加入。这是因为您将空对象转换为字符串。

    试试这个:

    System.out.println(tArtikelEntity==null?null:tArtikelEntity.toString());

    【讨论】:

    • 同时删除 fetchtype lazy (您可能正在从其他表中获取值)
    • tArtikelEntitiy 不为空,NullPointerException 在第 4 行!
    • tArtikelEntity.toString() 返回:TArtikelEntity{kArtikel=189820, cArtNr='10513', nIstVater=1}
    • session.get 函数的作用是使用其主键从类中获取数据。它不一定要加入。也许您需要的是标准
    • 你能举个例子吗?
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2016-05-15
    • 2018-09-08
    相关资源
    最近更新 更多