如何在hibernate中使用现有实体创建新实体
例如,我们有一个非常嵌套的对象如何在hibernate中使用现有实体创建新实体,hibernate,jpa-2.0,Hibernate,Jpa 2.0,例如,我们有一个非常嵌套的对象 Class A { Set<B> Set<C> Set<D> } Class B{ Set<P> } Class P { Set<X> } 现在我的要求是创建重复的对象 由于我们不想接触现有的实体,所以我们需要创建完整的对象 hibernate是否提供了创建完整对象的方法,而不是手动迭代每个对象并使Ids为空 谢谢。我不确定我是否了解你的问题。假设您已经创建或注入了entityman
Class A {
Set<B>
Set<C>
Set<D>
}
Class B{
Set<P>
}
Class P {
Set<X>
}
现在我的要求是创建重复的对象
由于我们不想接触现有的实体,所以我们需要创建完整的对象
hibernate是否提供了创建完整对象的方法,而不是手动迭代每个对象并使Ids为空
谢谢。我不确定我是否了解你的问题。假设您已经创建或注入了entitymanager,为什么不在Java中创建一个新实例并像这样保持它呢
@Inject EntityManager entityManager;
....
A a = new A();
a.setFieldx(y); // etc for all fields you want to set
....
entityManager.persist(a);
回答一个老问题,因为它可能对仍然需要这种东西的人有所帮助。我们也有类似的要求,杰克逊前来救援。下面是一个简单的例子:
public class Test {
static class A {
String id;
String text;
B objectB;
//Getters & Setters
}
static class B {
String id;
String text;
//Getters & Setters
}
@JsonFilter("idFilter")
class PropertyFilterMixIn {
}
public static void main(String args[]) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(
Object.class, PropertyFilterMixIn.class);
String[] ignorableFieldNames = { "id" };
FilterProvider filters = new SimpleFilterProvider()
.addFilter("idFilter",
SimpleBeanPropertyFilter.serializeAllExcept(
ignorableFieldNames));
ObjectWriter writer = mapper.writer(filters);
final A a = new A();
a.setId("10");
a.setText("A-Obj");
B b = new B();
b.setText("B-Obj");
b.setId("12");
a.setObjectB(b);
final String string = writer.writeValueAsString(a);
final A readValue = mapper.readValue(string, A.class);
System.out.println(readValue);
}
}
需要考虑的一件事是,如果实体是双向的,那么在JSON编组/解编组中可能会导致stackoverflow异常。所以,在实体上使用适当的注释来解决这个问题。如果我将实体id设置为null并将其持久化,它就可以了,但我不希望这样,因为它是一个非常复杂的对象。我想要一个更好的选择,但谢谢你给我时间。我不会像你那样操纵实体ID。你应该创建一个新的对象实例,然后如果你必须复制大量字段,你可以使用Apache BeanUtils->copyProperties。我使用dozer mapper进行字段映射,但是我们必须在列表子对象中复制父对象的引用。您知道,对于复杂的it对象来说,这是一项非常乏味的任务。