2013-11-20 136 views
1

我有两个类JPA继承 - 更改实体类型

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="PERSONTYPE") 
@DiscriminatorValue(value="PERSON") 
public class Parent { 
    ....... 
} 


@Entity 
@DiscriminatorValue(value="CHILD") 
public class Child extends Parent{ 
    ....... 
} 

的情况下,我有:

1-创建人 - 那么PERSONTYPE = '人'

2-进入Person页面并通过选中“Is Child”复选框将其更新为'CHILD',然后在保存Person后必须保存为'CHILD'类型。

那么如何将实体类型从'PERSON'更改为'CHILD'?

在此先感谢

+0

做你尝试分配的孩子到新的父实例包括id字段的值是多少? – erencan

+1

继承不是这里正确的设计。就像在Java中一样,对象也不能改变它的类型。使用带有子标志的单个实体。 –

回答

0

这里有几个可能性:

这似乎显而易见的事情将是父对象上setIsChild(真)并提交它,但是我不知道怎么样JPA将对此做出反应,因为您现在正在提交一个Parent,结果是一个Child。不知道这是可能的。这绝对值得一试。

另一个选择是编写JPA更新语句(绕过子对象和父对象)来更新数据库中的is_child列。然后,当您随后查询此记录时,您将收到一个孩子不是父母。

最后,您可以创建一个包含所有父对象值的子对象,然后删除父对象并创建子对象。这将起作用,但除了删除/创建所需的额外处理,而不是一个简单的更新,孩子的ID可能会改变(如果您使用自动生成的ID,它会改变)。国际海事组织,这不是一个好的解决方案,但它会工作。

+0

感谢cmd为你回复:) – User

+0

其实我想改变DiscriminatorColumn“PERSONTYPE”在数据库中更改为随后创建JPA查询,选择所有的孩子,所以我只是写'从儿童选择c',如果我添加布尔isChild我必须修改我所做的问题,并且对于最后的解决方案与我的情况无效,因为旧问题与其他实体有关,因此无法删除它?你有没有其他的建议或不可行? – User

0

我假设你有一个子对象这就是独特的性能为什么要使用继承,otherwize就像@ZB Ziet评论你应该使用儿童标志

解决方案1 ​​

我看到你正在使用单表继承策略,因此您必须修改descriminator字段manulay(通过使用SQL查询)并在子表上设置适当的字段。

UPDATE Parent SET PERSONTYPE='CHILD' WHERE id = 1 

practicaly您使用本机查询,这样

enityManager.createNativeQuery(“UPDATE PERSON SET PERSONTYPE = ?, ” 
“ VERSION = VERSION + 1 WHERE ID = ?”) 
.setParameter(1, 'CHILD') 
.setParameter(2,personID) 
.executeUpdate(); 

那么你可以使用EntityManager的获得孩子和设置属性

entityManager.find(Child.class,1).childProp=xxxx

**解决方案2 **

国际海事组织,这里做的最好的事情是代替usi吴单表策略,你应该使用连接表的策略

在连接表的战略新表

entireis为每个孩子有thier id作为外键父实体创建的。因此更改ID还将设置其父

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Person { 
... 

那将是冷静,如果你可以创建新的子集的ID相同,家长和保存。 Child c = new Child(); c.setId(parent.getId()); entityManager.merge(c)。但是hibernate试图重新创建一个父对象导致id confilict。

所以解决的办法就是编写本地查询 em.createNativeQuery("INSERT into child (id) VALUES (1)").executeUpdate(); //1 being the parent id

more reference on inheritance