hibernate能否实现非主键一对一关联

laoqi1999 2009-11-03 02:27:02
大家好:

有两个表

A
{
id
name
...
rule_id
}

B
{
id
Name
...
rule_id
}

他们在数据库里没有任何关系,但是实际上他们是一对一的关系,根据rule_id 能确定。

请问hibernate能否实现这种对应关系,使得查出了A对象,从A对象能得到B对象?


谢谢!


...全文
493 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
laoqi1999 2009-11-04
  • 打赏
  • 举报
回复
谢谢各位,我在hbm文件里把rule_id当做主键,1对1关联。
haojia0716 2009-11-03
  • 打赏
  • 举报
回复
如果在数据库里没有关系 那你就在逻辑代码里写关系 因为你知道关系

如果要在数据库里建立一对一关联 可以用one-to-one
一般用many-to-one + unique
rambosir 2009-11-03
  • 打赏
  • 举报
回复
使用hibernate<one-to-one>外键关联映射吧
liguominz 2009-11-03
  • 打赏
  • 举报
回复
mark
youjianbo_han_87 2009-11-03
  • 打赏
  • 举报
回复
学习。
nianersmall 2009-11-03
  • 打赏
  • 举报
回复

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "t_testa")
public class TestA implements Serializable
{
private static final long serialVersionUID = 5474359037731558807L;

@Id
@Column(name = "id", length = 36, nullable = false)
private String id = "";

@Column(name = "name", length = 50, nullable = false)
private String name = "";

@OneToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "testa_id", referencedColumnName = "testb_id")
private TestB testB = null;

public String getId()
{
return id;
}

public void setId(String id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public TestB getTestB()
{
return testB;
}

public void setTestB(TestB testB)
{
this.testB = testB;
}

@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}

@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestA other = (TestA) obj;
if (id == null)
{
if (other.id != null)
return false;
}
else if (!id.equals(other.id))
return false;
return true;
}
}


import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_testb")
public class TestB implements Serializable
{
private static final long serialVersionUID = -5227555122162835236L;

@Id
@Column(name = "id", length = 36, nullable = false)
private String id = "";

@Column(name = "name", length = 50, nullable = false)
private String name = "";

@Column(name = "testb_id", length = 36, nullable = false)
private String testb_id = "";

public String getId()
{
return id;
}

public void setId(String id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public String getTestb_id()
{
return testb_id;
}

public void setTestb_id(String testbId)
{
testb_id = testbId;
}

@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}

@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestB other = (TestB) obj;
if (id == null)
{
if (other.id != null)
return false;
}
else if (!id.equals(other.id))
return false;
return true;
}
}


测试通过
nianersmall 2009-11-03
  • 打赏
  • 举报
回复
建议这样的情况不要用一对一关联做约束限制,但非要做的话,可以尝试如下配置:

@Column(name = "rule_id", length = 36, nullable = false)
private String rule_id = "";

@OneToOne(cascade = CascadeType.ALL, optional = false)
@PrimaryKeyJoinColumn(name = "rule_id", referencedColumnName = "rule_id")
private B b = null;


声明,我也没测试过,不知道是否能够生效;
youjianbo_han_87 2009-11-03
  • 打赏
  • 举报
回复
好像不行吧。

真的要用非主键关联的话,用原生 SQL吧。
  • 打赏
  • 举报
回复
使用联合主键,primary key(A_id,B_id)试试
laoqi1999 2009-11-03
  • 打赏
  • 举报
回复
具体怎么配置呢?
greenbar 2009-11-03
  • 打赏
  • 举报
回复
可以
invoked 2009-11-03
  • 打赏
  • 举报
回复
不能

67,518

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧