现有数据库表的Hibernate-OneToMany映射

时间:2019-01-22 17:33:08

标签: java spring hibernate jpa

我正在尝试在OneToOne映射中加入休眠实体。我能够从主实体获取给定主键的数据,但是连接实体返回null。我是冬眠的新手,我们将不胜感激。

我有两个表,

PT_CORE

  • 主键:ptId-整数;
  • 外键:stId(ST_AUX)-整数;
  • 列:ptId,ptName

ST_AUX

  • 主键:stId;
  • 列:stId,stName

这两个表由其他应用程序填充,而我的表是只读操作。

下面是我的第一个Entity类(PtCore.java)

@Entity
@Table(name="PT_CORE")
public class PtCore implements Serializable{

    @Id
    @Column(name="ptId", nullable = false)
    private int id; 

    @Column(nullable=false)
    private int stId;  //The Foreign key column

    @OneToOne
    @JoinTable( name = "core_aux", joinColumns = {@JoinColumn(Name="ptId")},
                    inverseJoinColumns = {@JoinColumn(Name="stId")}
                )
    private StAux staux;

    //Getters, setters and toString() for above 
}

StAux是另一个实体,定义如下,

@Entity
@Table(name="ST_AUX")
public class StAux implements Serializable {

    @Id
    @Column(nullable=false)
    private Integer stId;

    @OneToOne                       
    private PtCore ptcore;

    @Column
    private String stName;
    //Getters, Setters and toString follow.
}

我在下面的“服务”方法中进行操作:

PtCore obj = (PtCore) session.get(PtCore.class,1);
System.out.println(obj);

在结果中,我得到了ptName的值,但是stAux类变量为空,表明该联接无法按预期工作。

2 个答案:

答案 0 :(得分:1)

首先,您的sockaddr_in6::sin6_addr中存在映射信息。我认为它类似于PIP_ADAPTER_ADDRESSES pAddresses = ...; // allocate buffer as needed... ULONG ulSize = ...; // size of allocated buffer... if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME, NULL, pAddresses, &ulSize) == 0) { for (PIP_ADAPTER_UNICAST_ADDRESS_LH *pAddress = pAddresses->FirstUnicastAddress; pAddress != NULL; pAddress = pAddress->Next) { SOCKADDR *pSockAddr = pAddress->Address.lpSockaddr; switch (pSockAddr->sa_family) { case AF_INET: { sockaddr_in *pInAddr = (sockaddr_in*) pSockAddr; // use pInAddr->sin_addr as needed... break; } case AF_INET6: { sockaddr_in6 *pIn6Addr = (sockaddr_in6*) pSockAddr; // use pIn6Addr->sin6_addr as needed... break; } } } } // free pAddresses as needed ... 。如果要使用现有的架构和现有的数据,我想实际上没有映射表PT_CORE。至少您没有提到它。但是,它可以显示为FOREIGN KEY (stid) REFERENCES (stid)批注,但是上面提到的外键仍然是真正的映射(因此再次不是联接表)。

我建议以下内容

删除此

core_aux

来自您的@JoinTable。我认为不需要。同样在@Column(nullable=false) private int stId; //The Foreign key column 中,删除PtCore(由于我在上面说过),然后将映射信息添加到PtCore批注中,例如:

@JoinTable

来自您的@OneToOne

然后@OneToOne @JoinColumn(name = "stid") private StAux staux; 中的内容也会有所变化:

PT_CORE

由于您已有表和约束,因此如果hibernate尝试通过JPA指令再次自动生成表和约束,则可能会引发错误。

检查this for example以获得更多信息。

更新:刚意识到您的标题是StAux,而代码中的@Id @Column(name = "stid") // this might not be needed but if there is like "st_id"... private Integer stId; // so just for sure @OneToOne(mappedBy = "staux") private PtCore ptcore;

因此,您可能想详细说明您的问题和/或标题。

答案 1 :(得分:0)

在您的关系中,拥有方是PtCore,相反方是StAux。

在双向OneToOne关系中,反面必须具有mappedBy属性。实际上,mappedBy属性包含拥有方的关联字段的名称。

因此,您必须更改您的反面代码(StAux实体)。您必须在StAux类的mappedBy中添加@OneToOne属性:

 @OneToOne(mappedBy="staux")                       
  private PtCore ptcore;