【问题标题】:Creating row in child table using jpa when we have a row in parent table当我们在父表中有一行时,使用 jpa 在子表中创建行
【发布时间】:2012-06-14 15:13:52
【问题描述】:

我有 2 张桌子:

CREATE TABLE `addr1` (
  `id` int(11) DEFAULT NULL,
  `addr2` varchar(20) DEFAULT NULL
) ENGINE=InnoDB;

CREATE TABLE `address` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `address` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

addr1 的主键是从地址表中设置的。我使用联合继承创建了我的实体

@Entity
@Table(name="addr1")
public class Addr1 extends Address {
    @Column(name="addr2")
    private String addr2;
    // getters and setters follows
}

@Entity
@Table(name = "address")
@Inheritance(strategy=InheritanceType.JOINED)
public class Address implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "address", nullable = false, length = 250, insertable = true)
    private String address;
    // getters and setters follows
}

现在我在地址表中有一行 ID 为 2。我想在 addr1 表中插入一行 ID 相同 (2)。我试过了

Address addr = em.getReference(Address.class, new Integer(4));
Addr1 addr1 = new Addr1(addr);
addr1.setAddr2("dsdsd");
em.persist(addr1);

但我遇到了一个错误

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException:分离的实体传递给 持久化:Addr1

请帮帮我。

问候, 普拉文

【问题讨论】:

  • 你能在你的代码中展示这个构造函数的作用吗?新的 Addr1(addr);

标签: java jpa jpa-2.0


【解决方案1】:

这是不可能的。继承意味着 is-a 关系。因此,您的实体实例可以是纯Address,也可以是Addr1。 Java 对象不能改变它的类型。您不能获取 Object 类型的对象,并要求 JVM 更改其类型并使其成为 String 类型的对象。这里也一样。

如果你需要这样做,那么你应该使用组合,而不是继承:一个地址可以拥有一个 Addr1。因此,您应该在 Address 和 Addr1 之间建立 OneToOne 关联,而不是继承关系。

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2018-03-19
    • 1970-01-01
    • 2016-12-06
    • 2019-02-27
    • 2014-02-15
    • 1970-01-01
    • 2020-05-04
    • 2018-03-12
    相关资源
    最近更新 更多