【问题标题】:JPA | One to one mapping with eager fetchJPA |使用 Eager fetch 的一对一映射
【发布时间】:2015-01-01 07:36:46
【问题描述】:

我正在使用 Hibernate 作为 JPA 提供程序的 JPA 示例应用程序。 其中我有一个与 EAGER 获取类型的一对一映射。

下面是我的代码块:

Person.java

public class Person extends Persistent  implements Serializable {

private static final long serialVersionUID = 1L;

String name;

// address as composition
Address address;

String addressId;

地址.java

public class Address extends Persistent implements Serializable {


private static final long serialVersionUID = 1L;


String address;

映射.xml

<entity name="Person" class="com.csam.mtp.wallet.wallet.Person"
    access="FIELD">
    <table name="person" />
    <attributes>

        <basic name="name">
            <column name="name" length="36" nullable="false" />
        </basic>

        <basic name="addressid">
            <column name="addressid" length="36"/>
        </basic>

        <one-to-one name="address" fetch="EAGER">
            <join-column name="addressid"
                referenced-column-name="id" insertable="false" updatable="false"
                nullable="false" />
        </one-to-one>

    </attributes>
</entity>
<entity name="address" class="com.csam.mtp.wallet.wallet.Address"
    access="FIELD">
    <table name="address" />
    <attributes>
        <basic name="address">
            <column name="address" length="36" />
        </basic>
    </attributes>
</entity>

数据库脚本

CREATE TABLE address (
id VARCHAR (50) not null,
address VARCHAR(50),
primary key(id)

);

CREATE TABLE person (
id VARCHAR (50) not null,
name VARCHAR(50),
addressid VARCHAR(50),
primary key(id),
foreign key (addressid) REFERENCES address(id),

);

驱动类

Address address = new Address();
    address.setAddress("test");
    address = addressRepository.save(address);

    Person person = new Person("Mike");

    //person.setAddressId(address.id());

    try {
        person = personRepository.save(person);
    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println(personRepository.exists(person.getID()));
    Person savedPerson = personRepository.findOne(person.getID());
    // Asserts
    assertNotNull(savedPerson);
    assertNotNull(savedPerson.id());

救人时如果我不设置地址id则救人成功,存在返回true,但找到一个api总是返回null

在保存人时,如果我先保存地址并亲自设置地址ID,然后再保存 它成功保存了人,存在返回true并找到一个api返回带有地址对象的Person对象(因为它很渴望)

所以下面是我的查询,

在一对一映射的情况下,是否需要在子节点上进行预取,子节点必须在保存父节点之前保存并设置在父节点中?

我试图找出相关的arcicle,但没有得到,请协助。

提前致谢

【问题讨论】:

    标签: spring hibernate jpa orm spring-data-jpa


    【解决方案1】:

    在您的情况下,地址是父母,人是孩子。这是因为 Child 通过 addressId FK 指向 Parent。

    因为你没有双向关联,所以你不应该有insertable="false" updatable="false"

    使用这些设置,Hibernate 将无法在 INSERT 或 UPDATE 查询中包含 addressId

    1. 删除insertable="false" updatable="false"
    2. 也删除addressId列,因为您可以通过address.id引用它
    3. 添加从人员到地址的级联:

      <one-to-one name="address" fetch="EAGER">
          <join-column name="addressid"
              referenced-column-name="id" nullable="false" />
          <cascade>
              <cascade-persist/>
              <cascade-merge/>
          </cascade>
      </one-to-one>       
      

    可能最好有一个双向关联,这样地址也可以引用一个人,在这种情况下,您可能应该有一个一对多的关联,因为一个地址可能有多个人。

    【讨论】:

    • 感谢您的回复。也可以通过可为空的true属性来实现。
    【解决方案2】:

    终于得到了nullable=true的解决方案,如下:

    <one-to-one name="address" fetch="EAGER">
            <join-column name="addressid"
                referenced-column-name="id" insertable="false" updatable="false"
                nullable="true" />
    </one-to-one>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2013-03-04
      相关资源
      最近更新 更多