栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate@OneToOne @NotNull

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate@OneToOne @NotNull

声明

@OneToOne
@NotNull
在关系的两边是否合法(…)我找不到任何表明无效的内容,但是在持久性过程中,似乎至少必须违反关系的一侧。(例如,如果
changeEntry
先写,
changeEntryDetails
则暂时为null)。

这是有效的,并且在正确映射的实体上一切正常。您需要将双向关联的一侧声明为“拥有”侧(此“控制”插入顺序)。一种可行的解决方案:

@Entity@NamedQueries( { @NamedQuery(name = ChangeEntry.FIND_ALL_CHANGEENTRIES, query = "SELECt c FROM ChangeEntry c") })public class ChangeEntry implements Serializable {    public final static String FIND_ALL_CHANGEENTRIES = "findAllChangeEntries";    @Id    @GeneratedValue    private Long id;    @oneToOne(optional = false, cascade = CascadeType.ALL)    @JoinColumn(name = "DETAILS_ID", unique = true, nullable = false)    @NotNull    private ChangeEntryDetails changeEntryDetails;    public void addDetails(ChangeEntryDetails details) {        this.changeEntryDetails = details;        details.setChangeEntry(this);    }    // constructor, getters and setters}

对于其他实体(请注意

mappedBy
在关联的非所有权方设置的属性):

@Entitypublic class ChangeEntryDetails implements Serializable {    @Id    @GeneratedValue    private Long id;    @oneToOne(optional = false, mappedBy = "changeEntryDetails")    @NotNull    private ChangeEntry changeEntry;    // constructor, getters and setters}

对于这些实体,以下测试(用于演示目的)通过:

public class ChangeEntryTest {    private static EntityManagerFactory emf;        private EntityManager em;    @BeforeClass    public static void createEntityManagerFactory() {        emf = Persistence.createEntityManagerFactory("TestPu");    }        @AfterClass    public static void closeEntityManagerFactory() {        emf.close();    }        @Before    public void beginTransaction() {        em = emf.createEntityManager();        em.getTransaction().begin();    }        @After    public void rollbackTransaction() {if (em.getTransaction().isActive()) { em.getTransaction().rollback();        }        if (em.isOpen()) { em.close();        }    }    @Test     public void testCreateEntryWithoutDetails() {        try { ChangeEntry entry = new ChangeEntry(); em.persist(entry); fail("Expected ConstraintViolationException wasn't thrown.");        } catch (ConstraintViolationException e) { assertEquals(1, e.getConstraintViolations().size()); ConstraintViolation<?> violation = e.getConstraintViolations()     .iterator().next(); assertEquals("changeEntryDetails", violation.getPropertyPath()     .toString()); assertEquals(NotNull.class, violation.getConstraintDescriptor()     .getAnnotation().annotationType());        }    }    @Test    public void testCreateDetailsWithoutEntry() { try { ChangeEntryDetails details = new ChangeEntryDetails(); em.persist(details); fail("Expected ConstraintViolationException wasn't thrown.");        } catch (ConstraintViolationException e) { assertEquals(1, e.getConstraintViolations().size()); ConstraintViolation<?> violation = e.getConstraintViolations()     .iterator().next(); assertEquals("changeEntry", violation.getPropertyPath()     .toString()); assertEquals(NotNull.class, violation.getConstraintDescriptor()     .getAnnotation().annotationType());        }    }    @Test    public void validEntryWithDetails() {        ChangeEntry entry = new ChangeEntry();        ChangeEntryDetails details = new ChangeEntryDetails();        entry.addDetails(details);        em.persist(entry);        Query query = em.createNamedQuery(ChangeEntry.FIND_ALL_CHANGEENTRIES);        assertEquals(1, query.getResultList().size());    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377041.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号