Создать постоянный объект, используя временный - PullRequest
1 голос
/ 07 февраля 2011

У меня есть 2 сопоставления, подобные этим:

<hibernate-mapping>  
    <class name="A" table="A">  
        <id name="code" column="aCode" type="integer">  
            <generator class="assigned"/>  
        </id>  
        <property name="info" type="integer"/>  
        <set name="Bs" lazy="false">
            <key>
                <column name="aCode" not-null="true"/>
            </key>
            <one-to-many class="B"/>
        </set>
    </class>  
    <class name="B" table="B">  
        <id name="code" column="bCode" type="integer">  
             <generator class="assigned"/>  
        </id>  
        <many-to-one name="a"/>  
    </class>  
</hibernate-mapping>  

Это классы:

public class A {  
    private int code;  
    private int info;  
    private Set<B> bs = new HashSet<B>(0);  
    public A() {};  
    public int getCode() { return code; }  
    public void setCode(int code) { this.code = code; }  
    public int getInfo() { return info; }  
    public void setInfo(int info) { this.info = info; }  
    public Set<B> getBs() { return bs; }  
    public void setBs(Set<B> bs) { this.bs = bs; }  
}

public class B {  
    private int code;  
    private A a;  
    public B() {};  
    public int getCode() { return code; }  
    public void setCode(int code) { this.code = code; }  
    public A getA() { return a; }  
    public void setA(A a) { this.a = a; }  
}  

Я нахожусь в сценарии, где мне приходится иметь дело с длинным переходом иследующее:

// Persistence Layer
Session session = factory.getCurrentSession();  
session.beginTransaction();  

A a1 = new A(); // Create transient object  
a1.setCode(1);  
a1.setInfo(10);  
session.save(a1); // Persist it  

// Something happening in another layer (see below)

// Continuing with the transaction
Object b = ... // Recover object
session.save(b); // Persist it using transient a2 object as a link but don't change/update its data

System.out.println(b.getA().getInfo()); // Returns 0 not 10;  
session.commit();  

Это происходит в другом слое (здесь нет доступа к сеансу):

// * Begin in another layer of the application *  
A a2 = new A(); // Create another transient object same *code* as before  
a2.setCode(1);  
B b = new B(); // Create another transient object  
b.setCode(1);  
b.set(a2);  
// * End and send the b Object to the persistence layer *  

Есть ли способ загрузить / получить постоянный дочерний объект до того, каксохранение родительского объекта или есть другой способ сохранить дочерний объект без изменения информации и очистки всего этого?Я не использую JPA.Извините, если я ужасно неправ.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011

В настоящее время состояние нового ребенка не сохраняется в базе данных, так как ваши отношения не имеют каскадирования, поэтому неправильное состояние ребенка не должно быть большой проблемой.

Однако, если вы хотите иметь согласованное состояние сущностей в памяти, вы можете использовать merge() вместо save(), без каскадирования это должно работать точно так, как вам нужно:

b = session.merge(b); // Persist it using transient a2 object as a link but don't change/update its data  
System.out.println(b.getA().getInfo()); // Should return 10

Смотри также:

0 голосов
/ 07 февраля 2011

Я думаю, что вы хотите сделать:

A a2 = (A)session.get(A.class, 1);
...