我正在尝试在OneToOne映射中加入休眠实体。我能够从主实体获取给定主键的数据,但是连接实体返回null。我是冬眠的新手,我们将不胜感激。
我有两个表,
PT_CORE
ST_AUX
这两个表由其他应用程序填充,而我的表是只读操作。
下面是我的第一个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类变量为空,表明该联接无法按预期工作。
答案 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;