大家好:有两个表A
{
id
name
...
rule_id
}B
{
id
Name
...
rule_id
}他们在数据库里没有任何关系,但是实际上他们是一对一的关系,根据rule_id 能确定。请问hibernate能否实现这种对应关系,使得查出了A对象,从A对象能得到B对象?
谢谢!

解决方案 »

  1.   

    使用联合主键,primary key(A_id,B_id)试试
      

  2.   

    好像不行吧。真的要用非主键关联的话,用原生 SQL吧。
      

  3.   

    建议这样的情况不要用一对一关联做约束限制,但非要做的话,可以尝试如下配置:@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;
    声明,我也没测试过,不知道是否能够生效;
      

  4.   


    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;
    }
    }
    测试通过
      

  5.   

    使用hibernate<one-to-one>外键关联映射吧
      

  6.   

    如果在数据库里没有关系 那你就在逻辑代码里写关系 因为你知道关系如果要在数据库里建立一对一关联 可以用one-to-one
    一般用many-to-one + unique
      

  7.   

    谢谢各位,我在hbm文件里把rule_id当做主键,1对1关联。