Если я сохраню класс с помощью hibernate, как я могу гарантировать, что значения некоторых полей объединяются, а другие создаются? - PullRequest
1 голос
/ 15 сентября 2010

Предположим, у меня есть класс 'Cheese' с полями type и purchaseDate, например:

public class Cheese{
    CheeseType cheeseType;
    String purchaseDate;

    public setPurchaseDate(String value){
      purchaseDate=value;
      }

public Class CheeseType{
      String type;

      public setType(String value){
         type=value;
         }

public class MyClass{
     Cheese cheese = new Cheese();
     cheese.setType("cedar");
     cheese.setPurchaseDate("01/02/03");
     // Code to get entity manager etc
     em.getTransaction().begin();
     em.persist(cheese);
     em.getTransaction().commit();
     // Code to close entity manager etc
     }

Пожалуйста, игнорируйте любые глупые ошибки в коде, я пытался упростить мою проблему!

Очевидно, что в реальной ситуации будет много других параметров, но в этом случае: одна и та же самая покупкаDate может существовать много раз в базе данных (столько раз, сколько я покупаю сыр!), Но «тип» уже существует вбаза данных (скажем, из предыдущих покупок).Теперь, каждый раз, когда я сохраняю экземпляр «Cheese» в базе данных, добавляется новый «CheeseType», то есть существует несколько «кедров».Как мне заставить каждый экземпляр 'Cheese' проверять, какие CheeseTypes уже существуют, а не создавать несколько новых кедров в базе данных?Я думаю, что мне нужно где-то слиться, но примеры, которые я видел, не похожи на те, которые я пытаюсь сделать.

Если у кого-то есть какие-либо советы, я был бы очень признателених!Приносим извинения, если я сделал здесь какие-либо ошибки новичка!

Ответы [ 2 ]

0 голосов
/ 15 сентября 2010

Как мне заставить каждый экземпляр 'Cheese' проверять, что CheeseType уже существует, и не создавать несколько новых кедров в базе данных?

Я не знаюесли это соответствует вашим потребностям, но если вы знаете, что у вас уже есть "cedar" CheeckType (при условии, что CheeseType является сущностью, а "cedar" является идентификатором - ваш пример неясен /связной), тогда вы можете использовать Session#load() или EntityManager#getReference(), если вы используете JPA, чтобы установить ассоциацию при создании нового Cheese, например:

 em.getTransaction().begin();

 CheeseType type = em.getReference(CheeseType.class, "cedar"); // no db hit 

 Cheese cheese = new Cheese();
 cheese.setType(type);
 cheese.setPurchaseDate("01/02/03");

 em.persist(cheese);
 em.getTransaction().commit();

Если выне знаю, если у вас уже есть "cedar" CheeseType, тогда вы действительно можете попробовать merge.Вот что говорится в спецификации JPA, раздел 3.2.4.1:

Семантика операции merge, примененной к сущности X, выглядит следующим образом: Если X - это новый экземпляр сущности,Создается новый экземпляр управляемого объекта X1, а состояние X копируется в новый экземпляр управляемого объекта X1.

Таким образом, merge будет вставляться / обновляться в зависимости от состояния объекта.Но убедитесь, что вы действительно понимаете, как работает merge (см. Ссылки ниже), объединение не является очевидной концепцией IMO.

Ресурсы

Смежные вопросы

0 голосов
/ 15 сентября 2010

Если тип сыра хранится в отдельной таблице, у вас должно быть сопоставление для него. Точно так же у вас должно быть отображение для Cheese, где вы определяете, как отобразить его свойства. Там вы можете указать связь между Cheese и CheeseType.

Чтобы это работало, CheeseType нужен идентификатор, который однозначно идентифицирует его экземпляры. Это позволяет вам знать, что два объекта CheeseType, каждый из которых имеет type = "cheddar", действительно являются одним и тем же логическим экземпляром. Очевидной возможностью является поле type, однако для этой цели обычно лучше использовать сгенерированный внутренний идентификатор.

Подробнее см. В главе Сопоставление сопоставлений в Справочнике по Hibernate.

...