当我们在父表中有一行时,使用jpa在子表中创建行

时间:2012-06-14 15:13:53

标签: java jpa jpa-2.0

我有两张桌子:

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

请帮帮我。

此致 普利文

1 个答案:

答案 0 :(得分:0)

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

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