2016-08-02 29 views
0

私は状況に合わせてthis exampleを使用しようと試みました。 PrimusはUser、Secundusはアカウントです。ユーザーは主キーをアカウントと共有する必要があります。すべては私が@OneToOne Hibernateの共有プライマリキーを使用したマッピングユーザーアカウント

User user = new User(); 
user.setName("Andy"); 
this.uDao.create(user); 

は大丈夫ですと動作します。:持続カスケード接続しようとするまで正常に動作しますが、...

User user = new User(); 
user.setName("Andy"); 
Account account = new Account(); 
account.setUsername("xyz"); 
user.setAccount(account); 
this.uDao.create(user); 

はエラーを与える:

01:14:35,844 INFO [stdout] (ServerService Thread Pool -- 80) Hibernate: insert into user (name) values (?) 

01:14:35,860 INFO [stdout] (ServerService Thread Pool -- 80) Hibernate: insert into account (username, user_id) values (?, ?) 

01:14:35,861 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ServerService Thread Pool -- 80) SQL Error: 1452, SQLState: 23000 
01:14:35,861 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ServerService Thread Pool -- 80) Cannot add or update a child row: a foreign key constraint fails (`shitstorm`.`account`, CONSTRAINT `fk_account_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

は私が何を行うことができます?私の間違いは何ですか?私は私の修士論文で、データベースに1対1の関係があり、これを処理する必要があります。私がCascading.persistを働かせることは重要です。私は非常に多くのチュートリアルを試して、非常に多くの説明を読んだが、私はこの状況に対処できません。リンクに投稿したチュートリアルは私の最後の試みでした。 Wildfly 8.2.1上で動作しています。ありがとうございます!ここで

SQLです:ここでは

CREATE TABLE IF NOT EXISTS `shitstorm`.`user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(45) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`)) 

-- ----------------------------------------------------- 
-- Table `shitstorm`.`account` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `shitstorm`.`account` (
    `user_id` INT(11) NOT NULL, 
    `username` VARCHAR(45) NULL DEFAULT NULL, 
    PRIMARY KEY (`user_id`), 
    INDEX `fk_account_user_idx` (`user_id` ASC), 
    CONSTRAINT `fk_account_user` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `shitstorm`.`user` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

は私のエンティティです:

@Entity 
@Table(name="user") 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(unique=true, nullable=false) 
    private int id; 

    @Column(length=45) 
    private String name; 

    //bi-directional one-to-one association to Account 
    @OneToOne(cascade=CascadeType.PERSIST, mappedBy="user") 
    private Account account; 

    public User() { 
    } 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
     if(this.account != null){ 
      this.account.setUserId(id); 
     } 
    } 

    public String getName() { 
     return this.name; 
    } 

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

    public Account getAccount() { 
     return this.account; 
    } 

    public void setAccount(Account account) { 
     this.account = account; 
     if(account != null){ 
      account.setUser(this); 
     } 
    } 

} 

@Entity 
    @Table(name="account") 
    @NamedQuery(name="Account.findAll", query="SELECT a FROM Account a") 
    public class Account implements Serializable { 
     private static final long serialVersionUID = 1L; 

     @Id 
     @Column(name="user_id", unique=true, nullable=false) 
     private int userId; 

     @Column(length=45) 
     private String username; 

     //bi-directional one-to-one association to User 
     @OneToOne 
     @PrimaryKeyJoinColumn(name="user_id") 
//@JoinColumn(name="user_id", nullable=false, insertable=false, updatable=false) -- was generated by JPA TOOLS 
     private User user; 



     public Account() { 
     } 

     public int getUserId() { 
      return this.userId; 
     } 

     public void setUserId(int userId) { 
      this.userId = userId; 
     } 

     public String getUsername() { 
      return this.username; 
     } 

     public void setUsername(String username) { 
      this.username = username; 
     } 

     public User getUser() { 
      return this.user; 
     } 

     public void setUser(User user) { 
      this.user = user; 
     } 

    } 
+1

あなたはuser' 'によってマッピングされているが、あなたの' Account'は、ユーザーが設定されているように思えません。あなたは 'account.setUsername(" xyz ")'の代わりに 'account.setUser(user)'を試しましたか? – Marvin

+0

はい、毎回ユーザーを設定するメソッドsetAccountに対して、Userに操作されたセッターがあります。しかし、エラーは同じです。 – Andy

+0

私はあなたが 'accountDAO.save(newAccount)'を使用して、あなたのユーザーpojoにこれを設定できると思います。 Hibernateはあなたのユーザpojoが一時的なものだと考えて、アカウントオブジェクトが存在しないレコードを参照することができないようにします。 一方、これらの2つのテーブルのfkは何ですか?あなたはアカウントテーブルにfkを追加するだけですね。 – MageXellos

答えて

3

次のようにあなたがより簡単にJPA 2+でこれを達成することができます

public class User{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(unique=true, nullable=false) 
    private int id; 

    @OneToOne(cascade=CascadeType.PERSIST, mappedBy = "user") 
    private Account account; 
} 

public class Account{ 

    @Id 
    @OneToOne 
    @JoinColumn(name = "user_id") 
    private User user; 
} 

参照:

https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

+0

ありがとう、それは今働いています。しかし、あなたのソリューションのように、@ Idアノテーションは1つのアカウントでしか使えません。私も@ Id int user_idを(wikibooksのように)入れようとすると、もう動作しません。なぜ彼らはそれをやっているのですか?私は@ IdClassとキーを組み合わせたとき、これは必須ですか? – Andy

関連する問題