私は状況に合わせて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;
}
}
あなたはuser' 'によってマッピングされているが、あなたの' Account'は、ユーザーが設定されているように思えません。あなたは 'account.setUsername(" xyz ")'の代わりに 'account.setUser(user)'を試しましたか? – Marvin
はい、毎回ユーザーを設定するメソッドsetAccountに対して、Userに操作されたセッターがあります。しかし、エラーは同じです。 – Andy
私はあなたが 'accountDAO.save(newAccount)'を使用して、あなたのユーザーpojoにこれを設定できると思います。 Hibernateはあなたのユーザpojoが一時的なものだと考えて、アカウントオブジェクトが存在しないレコードを参照することができないようにします。 一方、これらの2つのテーブルのfkは何ですか?あなたはアカウントテーブルにfkを追加するだけですね。 – MageXellos