@OneToOne 与 Hibernate 共享主键用户 - 帐户的映射

2024-01-30

我尝试过带这个例子 http://vard-lokkur.blogspot.de/2011/05/onetoone-with-shared-primary-key.html为我的情况而工作。 Primus 是用户,Secundus 是帐户。用户应与帐户共享主密钥。一切正常,直到我尝试级联持久化:

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 发挥作用对我来说很重要。我尝试了很多教程并阅读了很多解释,但我无法处理这种情况。我在链接中发布的教程是我的最后一次尝试。该 aaplication 正在 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);
        }
    }

}

and

   @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+ 中更简单地实现此目的,如下所示:

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

See:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@OneToOne 与 Hibernate 共享主键用户 - 帐户的映射 的相关文章

随机推荐

  • 如何检查 UIWebView 是否为空

    我需要检查加载完成后的网络视图是否有任何内容 我的要求很简单 它是我页面底部的一个小网络视图条 就像广告一样 I call NSURLRequest request NSURLRequest requestWithURL adURL gWe
  • 这里的地图导航 - 留下的痕迹

    我使用 Here 地图 sdk 作为导航解决方案 到目前为止一切都很好 除了有点不方便 在导航模式下 我看到计算的路线如何在 3D 模式下围绕当前位置渲染 以及当前位置如何正确显示在地图上 在onPositionUpdated打回来 但是
  • 让 Kinect SDK 在 C++ 中与 Visual Studio 2010 配合使用

    我一直在遵循微软为使用 c 设置 Kinect SDK 所做的指南 他们创建的步骤如下 在源代码中包含 windows h 要使用 NUI API 请包含 MSR NuiApi h 位置 Program Files Microsoft Re
  • Firefox DOM解析器问题

    由于某种原因 DOMParser 为每个换行符添加了一些额外的 text 元素 n对于这个网址 http rt com Root rss http rt com Root rss 以及我尝试过的许多其他 RSS 我检查了 cnn bbc f
  • React 在没有构造函数的情况下定义状态 [重复]

    这个问题在这里已经有答案了 我见过一些 React 开发人员在没有构造函数的情况下定义状态 我喜欢这样简化代码 但是这样做安全吗 class Dog extends React Component state sound Woof retu
  • 我可以在 Play! 中使用什么 SBT 构建设置? 2 框架将包含类路径上源树中的特定资源

    我想在构建中添加一个设置 该设置将从 src 树中的某个位置复制特定文件 以便它们在开发和生产模式下的类路径上可用 我不想把它们放在public文件夹 因为我不希望它们可供下载 我不想把它们放在conf文件夹 因为我想保持配置文件的干净 例
  • 查找networkx中满足特定条件的边

    我有一个网络x有向图 http networkx github io documentation latest reference classes digraph html具有节点上的属性 并且我想找到特定节点属性不同的所有边 有没有办法自
  • MongoDB 中的批量更新/更新插入?

    是否可以在 MongoDB 中进行批量更新 更新插入 而不是插入 如果是 请指出与此相关的任何文档 Thanks 您可以使用命令行程序蒙戈进口公司它应该在你的 MongoDB bin 目录中 您需要考虑使用两个选项upsert upsert
  • 具有多线程的实体框架事务

    我有一个运行多个线程的应用程序 线程不共享 ObjectContext 每个线程都有自己的 我知道它们不是线程安全的 然而 线程都在共享事务下运行 原始线程创建一个 TransactionScope 它生成的每个线程都使用主线程上的 Tra
  • 创建 SKSpriteNode 子类的子类

    假设我想创建一堆不同类型的宇宙飞船 我想设置一个基本的宇宙飞船类 我可以用它来创建其他有细微差别的宇宙飞船 我的基类看起来像这样 BaseSpaceship h interface SpaceshipNode SKSpriteNode pr
  • 致命错误:在展开可选值时意外发现 nil [重复]

    这个问题在这里已经有答案了 我当时用的是UICollectionView在 Swift 中 但当我尝试更改单元格标签的文本时 我得到了 func collectionView collectionView UICollectionView
  • VB6中Property Set和Property Let有什么区别?

    我刚刚创建了几个Property Set方法 但它们没有编译 当我将它们更改为Property Let 一切都很好 此后我研究了文档以找出两者之间的区别Property Set and Property Let 但必须承认自己并不明智 有什
  • 如何在初始开发过程中使用 Clojure 库的本地存储库?

    我有一个关于开发 Clojure 库的问题 该问题在库开发和分发的建议工作流程中没有得到解答 如下所述 http clojure doc org articles ecosystem libraries authoring html htt
  • 使用 Rfc2898DeriveBytes 将 C# PBKDF2 转换为 PHP

    长话短说 我们在 NET 中内置了一个会员系统 我们正在将其移植到 WordPress 并且需要复制 PBKDF2 加密 以便用户无需重置密码 使用已知的散列密码 我可以使用以下代码轻松在 NET 中复制此内容 static void Ma
  • 单击数据表以过滤其他图表(dc.js)

    当我单击数据表中的一行时 我需要过滤其他图表 I did my table on pretransition function table table selectAll td dc table column on click functi
  • Visual Studio 2010 中的“抑制警告”菜单项不可用

    我正在使用Visual Studio 2010 Ultimate 似乎我无法像在VS2008中使用的方式抑制警告 我的项目是用 C 编写的 当我右键单击 错误列表 窗口中的警告时 例如 缺少公共类型的 XML 注释 我没有常用的菜单项来抑制
  • 为什么代理 Java 正则表达式会找到连字符减号 -

    我试图找出为什么 JAVA 中存在这个正则表达式 ud800 udbff udc00 udfff 用于replaceAll regexp 还将删除连字符减号以及代理字符 这个的 Unicode 是 u002d所以它似乎不在任何这些范围之内
  • GHC - Mac OS X - ld:未知选项:-no_pie

    当我尝试在 Haskell 中编译一个简单的 Hello World 并使用ghc make Main hs I get 链接主 ld 未知选项 no pieCollect2 ld 返回 1 退出状态 我使用的是 Mac OS X 10 6
  • 如何在服务器端 (Node.js) 以编程方式验证 Facebook 用户的访问令牌?

    我有 Facebook 用户的访问令牌 我想验证该访问令牌是否有效 即 Facebook 是否知道它 当前是否有效等等 到目前为止 我已经浏览了各种Facebook 的 API https developers facebook com d
  • @OneToOne 与 Hibernate 共享主键用户 - 帐户的映射

    我尝试过带这个例子 http vard lokkur blogspot de 2011 05 onetoone with shared primary key html为我的情况而工作 Primus 是用户 Secundus 是帐户 用户应