@OneToOne与Hibernate共享主键的映射用户-帐户 [英] @OneToOne Mapping with Hibernate shared primary key User - Account

查看:83
本文介绍了@OneToOne与Hibernate共享主键的映射用户-帐户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用此示例为我的处境工作. Primus是用户,Secundus是帐户.用户应与帐户共享主键.一切正常,直到我尝试级联持久化.:

i have tried out to bring this example to work for my Situation. Primus is User, Secundus is Account. User should share the primary key with Account. Everything works fine till i try to cascade a persist.:

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上运行.非常感谢!

What can i do? What is my mistake? I'm in my master thesis and have some 1:1 relationships in my database and need to handle this. It's important for me to bring the Cascading.persist to work. I tried out so many tutorials and read so many explanations but i can't handle this situation. The tutorial i have posted in the link was my last attempt. The aaplication is running on Wildfly 8.2.1 Thank's a lot!

这是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;
        }

    }

推荐答案

您可以在JPA 2+中更简单地实现此目标,如下所示:

You can achieve this more simply in JPA 2+ as follows:

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_Sequence_An_Sequencing#ManlyToTo_Primary_ /a>

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

这篇关于@OneToOne与Hibernate共享主键的映射用户-帐户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆