public void testMetamodelCriteriaUpdateEmbeddedField() {
    if ((getPersistenceUnitServerSession()).getPlatform().isSymfoware()) {
      getPersistenceUnitServerSession()
          .logMessage(
              "Test updateEmbeddedFieldTest skipped for this platform, "
                  + "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
      return;
    }

    EntityManager em = createEntityManager();
    int nrOfEmps =
        ((Number)
                em.createQuery("SELECT COUNT(e) FROM Employee e where e.firstName is not null")
                    .getSingleResult())
            .intValue();

    Metamodel metamodel = em.getMetamodel();
    EntityType<Employee> entityEmp_ = metamodel.entity(Employee.class);
    javax.persistence.metamodel.EmbeddableType<EmploymentPeriod> embedEmpPeriod_ =
        metamodel.embeddable(EmploymentPeriod.class);

    Calendar startCalendar = Calendar.getInstance();
    startCalendar.set(1905, 11, 31, 0, 0, 0);
    java.sql.Date startDate = new java.sql.Date(startCalendar.getTime().getTime());

    // em.createQuery("UPDATE Employee e SET e.period.startDate=
    // :startDate").setParameter("startDate", startDate).executeUpdate();
    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaUpdate<Employee> cq = qb.createCriteriaUpdate(Employee.class);
    Root<Employee> root = cq.from(entityEmp_);
    cq.set(
        root.get(entityEmp_.getSingularAttribute("period", EmploymentPeriod.class))
            .get(embedEmpPeriod_.getSingularAttribute("startDate", java.sql.Date.class)),
        startDate);

    beginTransaction(em);
    try {
      clearCache();

      int updated = em.createQuery(cq).executeUpdate();
      assertEquals(
          "testCriteriaUpdateEmbeddedField: wrong number of updated instances", nrOfEmps, updated);

      // check database changes
      int nr =
          ((Number)
                  em.createQuery(
                          "SELECT COUNT(e) FROM Employee e WHERE e.period.startDate = :startDate")
                      .setParameter("startDate", startDate)
                      .getSingleResult())
              .intValue();
      assertEquals(
          "testCriteriaUpdateEmbeddedField: unexpected number of changed values in the database",
          nrOfEmps,
          nr);
    } finally {
      if (isTransactionActive(em)) {
        rollbackTransaction(em);
      }
      closeEntityManager(em);
    }
  }
  @Test
  public void testInjections() throws Exception {
    // Address (embeddable)
    assertNotNull(Address_.address1);
    assertNotNull(Address_.address2);
    assertNotNull(Address_.city);
    final EmbeddableType<Address> addressType = (EmbeddableType<Address>) House_.address.getType();
    assertEquals(addressType.getDeclaredSingularAttribute("address1"), Address_.address1);
    assertEquals(addressType.getDeclaredSingularAttribute("address2"), Address_.address2);
    assertTrue(Address_.address1.isOptional());
    assertFalse(Address_.address2.isOptional());

    // Animal (mapped superclass)
    assertNotNull(Animal_.id);
    assertTrue(Animal_.id.isId());
    assertEquals(Long.class, Animal_.id.getJavaType());
    assertNotNull(Animal_.legNbr);
    //		assertEquals( Integer.class, Animal_.legNbr.getJavaType() );
    assertEquals(int.class, Animal_.legNbr.getJavaType());

    // Cat (hierarchy)
    assertNotNull(Cat_.id);
    assertNotNull(Cat_.id.isId());
    assertEquals(Animal.class, Cat_.id.getJavaMember().getDeclaringClass());
    assertNotNull(Cat_.nickname);

    // FoodItem
    assertNotNull(FoodItem_.version);
    assertTrue(FoodItem_.version.isVersion());

    // Fridge
    assertNotNull(Fridge_.id);
    assertTrue(Fridge_.id.isId());
    assertEquals(Long.class, Fridge_.id.getJavaType());
    assertNotNull(Fridge_.temperature);
    assertEquals("temperature", Fridge_.temperature.getName());
    assertEquals(Fridge.class, Fridge_.temperature.getDeclaringType().getJavaType());
    //		assertEquals( Integer.class, Fridge_.temperature.getJavaType() );
    //		assertEquals( Integer.class, Fridge_.temperature.getBindableJavaType() );
    //		assertEquals( Integer.class, Fridge_.temperature.getType().getJavaType() );
    assertEquals(int.class, Fridge_.temperature.getJavaType());
    assertEquals(int.class, Fridge_.temperature.getBindableJavaType());
    assertEquals(int.class, Fridge_.temperature.getType().getJavaType());
    assertEquals(Bindable.BindableType.SINGULAR_ATTRIBUTE, Fridge_.temperature.getBindableType());
    assertEquals(Type.PersistenceType.BASIC, Fridge_.temperature.getType().getPersistenceType());
    assertEquals(
        Attribute.PersistentAttributeType.BASIC, Fridge_.temperature.getPersistentAttributeType());
    assertFalse(Fridge_.temperature.isId());
    assertFalse(Fridge_.temperature.isOptional());
    assertFalse(Fridge_.temperature.isAssociation());
    assertFalse(Fridge_.temperature.isCollection());
    assertFalse(Fridge_.brand.isOptional());

    // House (embedded id)
    assertNotNull(House_.key);
    assertTrue(House_.key.isId());
    assertEquals(
        Attribute.PersistentAttributeType.EMBEDDED, House_.key.getPersistentAttributeType());
    assertNotNull(House_.address);
    assertEquals(
        Attribute.PersistentAttributeType.EMBEDDED, House_.address.getPersistentAttributeType());
    assertFalse(House_.address.isCollection());
    assertFalse(House_.address.isAssociation());
    assertNotNull(House_.rooms);
    assertTrue(House_.rooms.isAssociation());
    assertTrue(House_.rooms.isCollection());
    assertEquals(
        Attribute.PersistentAttributeType.ELEMENT_COLLECTION,
        House_.rooms.getPersistentAttributeType());
    assertEquals(Room.class, House_.rooms.getBindableJavaType());
    assertEquals(Bindable.BindableType.PLURAL_ATTRIBUTE, House_.rooms.getBindableType());
    assertEquals(Set.class, House_.rooms.getJavaType());
    assertEquals(PluralAttribute.CollectionType.SET, House_.rooms.getCollectionType());
    assertEquals(
        Type.PersistenceType.EMBEDDABLE, House_.rooms.getElementType().getPersistenceType());
    assertNotNull(House_.roomsByName);
    assertEquals(String.class, House_.roomsByName.getKeyJavaType());
    assertEquals(Type.PersistenceType.BASIC, House_.roomsByName.getKeyType().getPersistenceType());
    assertEquals(PluralAttribute.CollectionType.MAP, House_.roomsByName.getCollectionType());
    assertNotNull(House_.roomsBySize);
    assertEquals(
        Type.PersistenceType.EMBEDDABLE, House_.roomsBySize.getElementType().getPersistenceType());
    assertEquals(PluralAttribute.CollectionType.LIST, House_.roomsBySize.getCollectionType());

    // Person (mapped id)
    assertNotNull(Person_.firstName);
    assertNotNull(Person_.lastName);
    assertTrue(Person_.firstName.isId());
    assertTrue(Person_.lastName.isId());
    assertTrue(Person_.lastName.isId());

    // Garden List as bag
    assertNotNull(Garden_.flowers);
  }