我有两张桌子:
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
请帮帮我。
此致 普利文
答案 0 :(得分:0)
这是不可能的。继承意味着是-a 关系。因此,您的实体实例可以是裸Address
或Addr1
。 Java对象无法更改其类型。您不能获取Object类型的对象,并要求JVM更改其类型并使其成为String类型的对象。这里也一样。
如果你需要这样做,那么你应该使用组合而不是继承:一个地址可以拥有一个Addr1。因此,您应该在Address和Addr1之间建立一个OneToOne关联,而不是继承关系。