2012-03-27 18 views
3

2つのテーブルの間に1対1の関係を作成しようとしています。それらのハイバネートと1対1の関係

一つは、人である:

public class Person implements Serializable { 

static final long serialVersionUID = 1L; 


private long id; 
private String _email; 
    private String _pass; 

    public long getId() { 
     return id; 
    } 


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

public String getEmail() { 
     return _email; 
    } 


    public void set_email(String _email) { 
     this._email = _email; 
    } 


    public String getPass() { 
     return _pass; 
    } 


    public void set_pass(String _pass) { 
     this._pass = _pass; 
    } 
} 

、2番目はReqC2dmRegIdテーブルです:

public class ReqC2dmRegId implements Serializable { 

private static final long serialVersionUID = 1L; 
Person person; 
String C2dmid; 
private long id; 

public ReqC2dmRegId(){} 

public String getC2dmid() { 
    return C2dmid; 
} 


public void setC2dmid(String c2dmid) { 
    C2dmid = c2dmid; 
} 

public ReqC2dmRegId(Person person, String C2dmid) { 
    super(); 
    this.person = person; 
    this.C2dmid = C2dmid; 
} 


public Person getPerson() { 
    return person; 
} 


public void setPerson(Person person) { 
    this.person = person; 
} 


public long getId() { 
    return id; 
} 


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

さて、私のプログラムでは、私はいつもPerson最初とを作成するだけで、私は追加必要なときこのReqC2dmRegId

ここでは、この2つのテーブルをリンクすることを試みます。私はこれを維持するとき、私はReqC2dmRegId(もちろん、私はReqC2dmRegIdの人に右のIDを追加する)私は自分のReqC2dmRegIdに更新するか、Personというidを持つ新しい行をに保存したいと思います。私は間違って何をやっている

ReqC2dmRegId.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Mar 26, 2012 11:29:57 AM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="c2dm.ReqC2dmRegId" table="REQC2DMREGID"> 
     <id name="id" type="long"> 
     <generator class="foreign"> 
      <param name="property">person</param> 
      </generator> 
     </id> 
     <one-to-one name="person" class="Entities.Person" cascade="all" /> 


     <property name="C2dmid" type="java.lang.String"> 
      <column name="C2DMID" /> 
     </property> 
    </class> 
</hibernate-mapping> 

Person.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Mar 26, 2012 11:29:57 AM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="Entities.Person" table="PERSON"> 
     <id name="id" type="long"> 
      <column name="ID" /> 
      <generator class="increment" /> 
     </id> 
     <property name="_email" type="java.lang.String" access="field"> 
      <column name="_EMAIL" /> 
     </property> 
     <property name="_pass" type="java.lang.String" access="field"> 
      <column name="_PASS" /> 
     </property> 
    </class> 
</hibernate-mapping> 

これらは私のHBMファイルですか?

私が実行しようとすると:

//this should to update or save the object in DB 
     public void update (Object query){ 
        EntityManager em = emf.createEntityManager(); 
        em.getTransaction().begin(); 
        //em.createNativeQuery(query).executeUpdate(); 
        em.merge(query); 
        em.flush(); 
        em.getTransaction().commit(); 
        em.close(); 


       } 

を私が手:最後に

attempted to assign id from null one-to-one property:Person 

を、それは次のようになります。

を人

**id  email    _pass** 
2  [email protected]  1234 

ReqC2dmRegId

**id  REQC2DMREGID** 
2  ffgghhjj 

更新: 私はこのように見えるように私は私のReqC2dmRegId.hbm.xml を変更することが
を働いていない方法を理解しようとあきらめた後(多対1):

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Mar 27, 2012 9:58:08 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> 
    <class name="c2dm.ReqC2dmRegId" table="REQC2DMREGID"> 
     <id name="id" type="long"> 
      <column name="ID" /> 
      <generator class="identity" /> 
     </id> 
     <many-to-one name="person" class="Entities.Person" fetch="join" unique="true" cascade="save-update" not-null="true" > 
      <column name="PERSON" /> 
     </many-to-one> 
     <property name="C2dmid" type="java.lang.String"> 
      <column name="C2DMID" /> 
     </property> 
    </class> </hibernate-mapping> 

と、この問題は、私は私の更新方法でReqC2dmRegIdテーブル を変更しようとすると、それが今と同じPERSONID

で行作成で正常に動作しています

私は "多くの1つの"プロパティを一意にすることができますが、 "正しい"行をinstated正しい行を更新しません= "true"?

あなたは関係の種類について明確にする必要があり、事前

+1

は、なぜあなたは代わりにXMLファイルの注釈を使用していけませんか?注釈が簡単で直感的に見つかる – suenda

+0

最初はxmlが何らかの理由で私にとってもっと簡単であることがわかった。そして私はそれらと仕事を始め、今ではすべてのオブジェクトを変更するのは難しい。 – user986474

答えて

0

でのおかげで:1対1または多対一のですか? 多対1の一方向の関係があるように見えます。ここで

は、注釈付きの例です:

@Entity 
@Table(name="PERSON") 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    private String _email; 
    private String _pass; 

    //getters and setters 
} 

そして、他のクラス:

@Entity 
@Table(name="ReqC2dmRegId") 
public class ReqC2dmRegId { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 

@ManyToOne 
@JoinColumn(name = "PERSON_ID") 
private Person person; 

//getters and setters 

}