加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 非空属性引用持久化值的空值或瞬时值

发布时间:2020-12-14 05:42:28 所属栏目:Java 来源:网络整理
导读:我试图使用JPA1持久化两个不同的实体,并使用Hibernate实现. 代码如下所示: 父实体类 @Entity@Table(name = "parent")public class Parent implements Serializable { {...} private Child child; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "c
我试图使用JPA1持久化两个不同的实体,并使用Hibernate实现.
代码如下所示:

父实体类

@Entity
@Table(name = "parent")
public class Parent implements Serializable {

    {...}
    private Child child;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "child_id",nullable = "false")
    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
}

子实体类

@Entity
@Table(name = "child")
public class Child implements Serializable {

    private Integer id;

    @Id
    @Column(name = "child_id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

测试用例

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/application.xml")
@Transactional
public class ParentTest extends TestCase {

    @PersistenceContext
    private EntityManager entityManager;

    @Test
    public void testSave() {
        Child child = new Child();
        child.setId(1);

        Parent parent = new Parent();
        parent.setChild(child);

        entityManager.persist(parent.getChild());
        entityManager.persist(parent); // throws the exception
    }
}

实体管理器和application.xml上的事务

<tx:annotation-driven transaction-manager="transactionManager" /> 

<jee:jndi-lookup id="dataSource" jndi-name="java:/jdbc/myds" expected-type="javax.sql.DataSource" /> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="com.mypackage" />
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"? 
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</prop>
        </props>
    </property>
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean>

当尝试插入父对象时,hibernate会抛出一个PropertyValueException异常,即孩子在此操作之前创建并持久化,即为null或transient.奇怪的是,这只是在单元测试中失败,在实际应用中,使用预插入的小孩,这与预期一样工作.

PS:
我很清楚,我可以映射孩子与级联坚持,但这不是这里的想法.我只想检查这两个是否独立工作.

解决方法

这里的问题是您正在使用设置的值来保持父表.
当它持续时,它需要必须保持的子表id,因为它是一个外键,因此它是一个not null属性引用一个空值.
@Test
    public void testSave() {
        Child child = new Child();
        child.setId(1);
        entityManager.persist(child); 

        Parent parent = new Parent();
        parent.setChild(child);

        entityManager.persist(parent); 
    }

尝试这样来保存孩子,然后保存父进程

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读