4

'Login'ドメインオブジェクトがあります:

public class Login extends AuditEntity {

private static final long serialVersionUID = -309839789761736747L;

private String userName;
private String password;
private Timestamp lastLogin;
private Set customers = new HashSet(0);
private Set addresses = new HashSet(0);

public Set getCustomers() {
    return this.customers;
}

public void setCustomers(Set customers) {
    this.customers = customers;
}

public Set getAddresses() {
    return this.addresses;
}

public void setAddresses(Set addresses) {
    this.addresses = addresses;
}
   //Other setter, getters

これが休止状態のマッピングファイルからのスニペットです:

        <set name="customers" fetch="select" lazy="false">
        <key>
            <column name="LoginID" />
        </key>
        <one-to-many class="com.domain.Customer" />
    </set>
    <set name="addresses" fetch="join" lazy="false">
        <key>
            <column name="LoginID" />
        </key>
        <one-to-many class="com.domain.Address" />
    </set>

ログイン参照のAddress.hbm.xmlマッピングは次のようになります。

    <many-to-one name="login" class="com.domain.Login"
        fetch="join" lazy="false">
        <column name="LoginID" />
    </many-to-one>

これが私の春のテストです:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
public class LoginDaoTest {

@Autowired
private BaseDao<Login, Integer> loginDao;

@Autowired
private BaseDao<Address, Integer> addressDao;

@Test
public void testLoginDao() {
    Login login = loginDao.load(1);
    Set<Address> addresses = login.getAddresses();

    System.out.println("size Before save..." + addresses.size());

    Address address = new Address();
    address.setCity("Kew gardens");
    address.setCreatedBy("user");
    address.setCreatedDate(new Timestamp(Calendar.getInstance().getTime().getTime()));
    address.setHouseNumber("1-2-3");
    address.setLogin(login);
    address.setLocality("Queens blvd");
    address.setState("NY");
    address.setStreetName("Some Street");
    address.setZipCode("11415");

    addressDao.save(address);

    System.out.println("size After save..." + addresses.size());

}

}

出力は次のとおりです。

size Before save...14
size After save...14

質問/問題私は怠惰にロードしていないので、新しいアドレスを追加した後、ログインオブジェクトに設定されたアドレスが1つ増えることを期待していました。セットのサイズが大きくならないのはなぜですか?同じトランザクションでクエリを実行しているためですか?

ありがとう。

4

1 に答える 1

7

オブジェクトのメモリ内の状態を維持する責任があります。Hibernate はそのアドレスを自動的にリストに貼り付けません。厳密に正しいコードを記述するには、作成時に新しいアドレスをリストに追加して、メモリ内の状態が保持しようとしているものと一致するようにする必要があります。

次に、Transitive Persistence を使用して新しいアドレスを作成できます。アドレスに対して「保存」を呼び出す必要はまったくありません。

概念的には、期待しているものとは逆に機能します。フレームワークの目的は、データベースをオブジェクトに魔法のように「バインド」することではありません。これは、データベースがない場合と同じように通常のオブジェクトを使用できるようにするためです (たとえば、オブジェクトをリストに入れるなど)。オブジェクトの状態を魔法のように永続化します。

于 2012-04-17T07:02:23.513 に答える