0

私は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

私を助けてください。

よろしく、 プラヴィーン

4

1 に答える 1

0

それは不可能だ。継承は is-a関係を意味します。したがって、エンティティ インスタンスは、ベアAddressまたはAddr1. また、Java オブジェクトはその型を変更できません。Object 型のオブジェクトを取得して、JVM にその型を変更し、代わりに String 型のオブジェクトにするように要求することはできません。ここも同じです。

それを行う必要がある場合は、継承ではなく構成を使用する必要があります。アドレスはAddr1を持つことができます。したがって、継承関係ではなく、Address と Addr1 の間に OneToOne 関連付けが必要です。

于 2012-06-15T05:49:21.733 に答える